From d650bb64e62ebd1d35e48fce230ae8157e371fee Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 25 May 2020 20:41:51 +0800 Subject: [PATCH 01/90] =?UTF-8?q?:art:=20=E6=8A=BD=E5=8F=96=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binarywang/wx/miniapp/bean/Watermark.java | 25 +++++++++++++++++++ .../wx/miniapp/bean/WxMaPhoneNumberInfo.java | 7 ------ .../wx/miniapp/bean/WxMaUserInfo.java | 5 ---- 3 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/Watermark.java diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/Watermark.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/Watermark.java new file mode 100644 index 0000000000..4747c77f84 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/Watermark.java @@ -0,0 +1,25 @@ +package cn.binarywang.wx.miniapp.bean; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 数据水印. + * + * @author Binary Wang + * @date 2020-05-25 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class Watermark implements Serializable { + private static final long serialVersionUID = 2375642809946928650L; + + private String timestamp; + private String appid; +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaPhoneNumberInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaPhoneNumberInfo.java index 398838eb80..149ecbebe8 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaPhoneNumberInfo.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaPhoneNumberInfo.java @@ -23,11 +23,4 @@ public static WxMaPhoneNumberInfo fromJson(String json) { return WxMaGsonBuilder.create().fromJson(json, WxMaPhoneNumberInfo.class); } - @Data - public static class Watermark implements Serializable { - private static final long serialVersionUID = 2375642809946928650L; - - private String timestamp; - private String appid; - } } 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 8b0ed8fe6a..368fa772cc 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 @@ -27,9 +27,4 @@ public static WxMaUserInfo fromJson(String json) { return WxMaGsonBuilder.create().fromJson(json, WxMaUserInfo.class); } - @Data - public static class Watermark { - private String timestamp; - private String appid; - } } From 8bb6b02cbaf36b18b5997dcc1f8787d1430a3442 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 25 May 2020 20:43:39 +0800 Subject: [PATCH 02/90] =?UTF-8?q?:art:=20#1580=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF=E9=87=8C?= =?UTF-8?q?=E6=80=A7=E5=88=AB=E5=AD=97=E6=AE=B5=E6=9E=9A=E4=B8=BE=E7=B1=BB?= =?UTF-8?q?=E5=A2=9E=E5=8A=A00=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/cp/bean/Gender.java | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/Gender.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/Gender.java index 2b6e26efde..d56bd57da9 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/Gender.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/Gender.java @@ -1,5 +1,8 @@ package me.chanjar.weixin.cp.bean; +import lombok.AllArgsConstructor; +import lombok.Getter; + /** *
  *  性别枚举
@@ -8,7 +11,13 @@
  *
  * @author Binary Wang
  */
+@Getter
+@AllArgsConstructor
 public enum Gender {
+  /**
+   * 未定义
+   */
+  UNDEFINED("未定义", "0"),
   /**
    * 男
    */
@@ -18,28 +27,14 @@ public enum Gender {
    */
   FEMALE("女", "2");
 
-  private String genderName;
-  private String code;
-
-  Gender(String genderName, String code) {
-    this.genderName = genderName;
-    this.code = code;
-  }
-
-  public String getGenderName() {
-    return this.genderName;
-  }
-
-  public String getCode() {
-    return this.code;
-  }
+  private final String genderName;
+  private final String code;
 
   public static Gender fromCode(String code) {
-    if ("1".equals(code)) {
-      return Gender.MALE;
-    }
-    if ("2".equals(code)) {
-      return Gender.FEMALE;
+    for(Gender a: Gender.values()){
+      if(a.code.equals(code)){
+        return a;
+      }
     }
 
     return null;

From 7b641e7b5bf847fe1a8320e6effbcfcec52cf195 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Mon, 25 May 2020 21:27:17 +0800
Subject: [PATCH 03/90] =?UTF-8?q?:art:=20=E5=B0=8F=E7=A8=8B=E5=BA=8F=20Spr?=
 =?UTF-8?q?ing=20Boot=20Starter=20=E6=A8=A1=E5=9D=97=E4=BC=98=E5=8C=96?=
 =?UTF-8?q?=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../README.md                                 |   4 +-
 .../pom.xml                                   |   2 -
 .../miniapp/config/WxMaAutoConfiguration.java |  43 ++++----
 .../wxjava/miniapp/enums/HttpClientType.java  |  14 +++
 .../wxjava/miniapp/enums/StorageType.java     |  22 ++++
 .../miniapp/properties/ConfigStorage.java     |  65 +++++++++++
 .../miniapp/properties/RedisProperties.java   |  52 +++++++++
 .../miniapp/properties/WxMaProperties.java    | 104 ------------------
 8 files changed, 178 insertions(+), 128 deletions(-)
 create mode 100644 spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/HttpClientType.java
 create mode 100644 spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/StorageType.java
 create mode 100644 spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/ConfigStorage.java
 create mode 100644 spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/RedisProperties.java

diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md
index e58dfc8c84..3d4fae2416 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md
@@ -18,12 +18,12 @@
     wx.miniapp.msgDataFormat = @msgDataFormat                  # 消息格式,XML或者JSON.
     # 存储配置redis(可选)
     # 注意: 指定redis.host值后不会使用容器注入的redis连接(JedisPool)
-    wx.miniapp.config-storage.type = jedis                     # 配置类型: memory(默认), jedis, redistemplate
+    wx.miniapp.config-storage.type = Jedis                     # 配置类型: Memory(默认), Jedis, RedisTemplate
     wx.miniapp.config-storage.key-prefix = wa                  # 相关redis前缀配置: wa(默认)
     wx.miniapp.config-storage.redis.host = 127.0.0.1
     wx.miniapp.config-storage.redis.port = 6379
     # http客户端配置
-    wx.miniapp.config-storage.http-client-type=httpclient      # http客户端类型: httpclient(默认)
+    wx.miniapp.config-storage.http-client-type=HttpClient      # http客户端类型: HttpClient(默认)
     wx.miniapp.config-storage.http-proxy-host=
     wx.miniapp.config-storage.http-proxy-port=
     wx.miniapp.config-storage.http-proxy-username=
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 f710eb1379..dc63257c79 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
@@ -22,13 +22,11 @@
     
       redis.clients
       jedis
-      provided
     
     
       org.springframework.data
       spring-data-redis
       ${spring.boot.version}
-      provided
     
   
 
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java
index 1c6d7865f3..ab843ab5bf 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java
@@ -5,6 +5,9 @@
 import cn.binarywang.wx.miniapp.config.WxMaConfig;
 import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
 import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl;
+import com.binarywang.spring.starter.wxjava.miniapp.enums.StorageType;
+import com.binarywang.spring.starter.wxjava.miniapp.properties.ConfigStorage;
+import com.binarywang.spring.starter.wxjava.miniapp.properties.RedisProperties;
 import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.redis.JedisWxRedisOps;
@@ -54,14 +57,17 @@ public WxMaService service(WxMaConfig wxMaConfig) {
   @Bean
   @ConditionalOnMissingBean(WxMaConfig.class)
   public WxMaConfig wxMaConfig() {
-    WxMaProperties.StorageType type = wxMaProperties.getConfigStorage().getType();
     WxMaDefaultConfigImpl config;
-    if (type == WxMaProperties.StorageType.jedis) {
-      config = wxMaInJedisConfigStorage();
-    } else if (type == WxMaProperties.StorageType.redistemplate) {
-      config = wxMaInRedisTemplateConfigStorage();
-    } else {
-      config = wxMaInMemoryConfigStorage();
+    switch (wxMaProperties.getConfigStorage().getType()) {
+      case Jedis:
+        config = wxMaJedisConfigStorage();
+        break;
+      case RedisTemplate:
+        config = wxMaRedisTemplateConfigStorage();
+        break;
+      default:
+        config = wxMaDefaultConfigStorage();
+        break;
     }
 
     config.setAppid(StringUtils.trimToNull(this.wxMaProperties.getAppid()));
@@ -70,7 +76,7 @@ public WxMaConfig wxMaConfig() {
     config.setAesKey(StringUtils.trimToNull(this.wxMaProperties.getAesKey()));
     config.setMsgDataFormat(StringUtils.trimToNull(this.wxMaProperties.getMsgDataFormat()));
 
-    WxMaProperties.ConfigStorage configStorageProperties = wxMaProperties.getConfigStorage();
+    ConfigStorage configStorageProperties = wxMaProperties.getConfigStorage();
     config.setHttpProxyHost(configStorageProperties.getHttpProxyHost());
     config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername());
     config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword());
@@ -80,13 +86,12 @@ public WxMaConfig wxMaConfig() {
     return config;
   }
 
-  private WxMaDefaultConfigImpl wxMaInMemoryConfigStorage() {
-    WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
-    return config;
+  private WxMaDefaultConfigImpl wxMaDefaultConfigStorage() {
+    return new WxMaDefaultConfigImpl();
   }
 
-  private WxMaDefaultConfigImpl wxMaInJedisConfigStorage() {
-    WxMaProperties.RedisProperties redisProperties = wxMaProperties.getConfigStorage().getRedis();
+  private WxMaDefaultConfigImpl wxMaJedisConfigStorage() {
+    RedisProperties redisProperties = wxMaProperties.getConfigStorage().getRedis();
     JedisPool jedisPool;
     if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) {
       jedisPool = getJedisPool();
@@ -94,20 +99,18 @@ private WxMaDefaultConfigImpl wxMaInJedisConfigStorage() {
       jedisPool = applicationContext.getBean(JedisPool.class);
     }
     WxRedisOps redisOps = new JedisWxRedisOps(jedisPool);
-    WxMaRedisBetterConfigImpl wxMaRedisConfig = new WxMaRedisBetterConfigImpl(redisOps, wxMaProperties.getConfigStorage().getKeyPrefix());
-    return wxMaRedisConfig;
+    return new WxMaRedisBetterConfigImpl(redisOps, wxMaProperties.getConfigStorage().getKeyPrefix());
   }
 
-  private WxMaDefaultConfigImpl wxMaInRedisTemplateConfigStorage() {
+  private WxMaDefaultConfigImpl wxMaRedisTemplateConfigStorage() {
     StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
     WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate);
-    WxMaRedisBetterConfigImpl wxMaRedisConfig = new WxMaRedisBetterConfigImpl(redisOps, wxMaProperties.getConfigStorage().getKeyPrefix());
-    return wxMaRedisConfig;
+    return new WxMaRedisBetterConfigImpl(redisOps, wxMaProperties.getConfigStorage().getKeyPrefix());
   }
 
   private JedisPool getJedisPool() {
-    WxMaProperties.ConfigStorage storage = wxMaProperties.getConfigStorage();
-    WxMaProperties.RedisProperties redis = storage.getRedis();
+    ConfigStorage storage = wxMaProperties.getConfigStorage();
+    RedisProperties redis = storage.getRedis();
 
     JedisPoolConfig config = new JedisPoolConfig();
     if (redis.getMaxActive() != null) {
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/HttpClientType.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/HttpClientType.java
new file mode 100644
index 0000000000..18ca00dd77
--- /dev/null
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/HttpClientType.java
@@ -0,0 +1,14 @@
+package com.binarywang.spring.starter.wxjava.miniapp.enums;
+
+/**
+ * httpclient类型.
+ *
+ * @author Binary Wang
+ * @date 2020-05-25
+ */
+public enum HttpClientType {
+  /**
+   * HttpClient.
+   */
+  HttpClient
+}
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/StorageType.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/StorageType.java
new file mode 100644
index 0000000000..9328980bb2
--- /dev/null
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/StorageType.java
@@ -0,0 +1,22 @@
+package com.binarywang.spring.starter.wxjava.miniapp.enums;
+
+/**
+ * storage类型.
+ *
+ * @author Binary Wang
+ * @date 2020-05-25
+ */
+public enum StorageType {
+  /**
+   * 内存.
+   */
+  Memory,
+  /**
+   * redis(JedisClient).
+   */
+  Jedis,
+  /**
+   * redis(RedisTemplate).
+   */
+  RedisTemplate
+}
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/ConfigStorage.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/ConfigStorage.java
new file mode 100644
index 0000000000..921075d1d3
--- /dev/null
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/ConfigStorage.java
@@ -0,0 +1,65 @@
+package com.binarywang.spring.starter.wxjava.miniapp.properties;
+
+import com.binarywang.spring.starter.wxjava.miniapp.enums.HttpClientType;
+import com.binarywang.spring.starter.wxjava.miniapp.enums.StorageType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 存储策略.
+ *
+ * @author Binary Wang
+ * @date 2020-05-25
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class ConfigStorage implements Serializable {
+  private static final long serialVersionUID = 4815731027000065434L;
+
+  /**
+   * 存储类型.
+   */
+  private StorageType type = StorageType.Memory;
+
+  /**
+   * 指定key前缀.
+   */
+  private String keyPrefix = "wa";
+
+  /**
+   * redis连接配置.
+   */
+  private RedisProperties redis;
+
+  /**
+   * http客户端类型.
+   */
+  private HttpClientType httpClientType = HttpClientType.HttpClient;
+
+  /**
+   * http代理主机.
+   */
+  private String httpProxyHost;
+
+  /**
+   * http代理端口.
+   */
+  private Integer httpProxyPort;
+
+  /**
+   * http代理用户名.
+   */
+  private String httpProxyUsername;
+
+  /**
+   * http代理密码.
+   */
+  private String httpProxyPassword;
+
+}
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/RedisProperties.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/RedisProperties.java
new file mode 100644
index 0000000000..5e630c727f
--- /dev/null
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/RedisProperties.java
@@ -0,0 +1,52 @@
+package com.binarywang.spring.starter.wxjava.miniapp.properties;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * redis配置.
+ *
+ * @author Binary Wang
+ * @date 2020-05-25
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class RedisProperties implements Serializable {
+  private static final long serialVersionUID = -5924815351660074401L;
+
+  /**
+   * 主机地址.
+   */
+  private String host;
+
+  /**
+   * 端口号.
+   */
+  private int port = 6379;
+
+  /**
+   * 密码.
+   */
+  private String password;
+
+  /**
+   * 超时.
+   */
+  private int timeout = 2000;
+
+  /**
+   * 数据库.
+   */
+  private int database = 0;
+
+  private Integer maxActive;
+  private Integer maxIdle;
+  private Integer maxWaitMillis;
+  private Integer minIdle;
+}
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/WxMaProperties.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/WxMaProperties.java
index 5af54dfe1b..0bf267d6c5 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/WxMaProperties.java
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/WxMaProperties.java
@@ -3,8 +3,6 @@
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
-import java.io.Serializable;
-
 /**
  * 属性配置类.
  *
@@ -44,106 +42,4 @@ public class WxMaProperties {
    */
   private ConfigStorage configStorage = new ConfigStorage();
 
-  @Data
-  public static class ConfigStorage implements Serializable {
-    private static final long serialVersionUID = 4815731027000065434L;
-
-    /**
-     * 存储类型.
-     */
-    private StorageType type = StorageType.memory;
-
-    /**
-     * 指定key前缀.
-     */
-    private String keyPrefix = "wa";
-
-    /**
-     * redis连接配置.
-     */
-    private RedisProperties redis;
-
-    /**
-     * http客户端类型.
-     */
-    private HttpClientType httpClientType = HttpClientType.httpclient;
-
-    /**
-     * http代理主机.
-     */
-    private String httpProxyHost;
-
-    /**
-     * http代理端口.
-     */
-    private Integer httpProxyPort;
-
-    /**
-     * http代理用户名.
-     */
-    private String httpProxyUsername;
-
-    /**
-     * http代理密码.
-     */
-    private String httpProxyPassword;
-
-  }
-
-  public enum StorageType {
-    /**
-     * 内存.
-     */
-    memory,
-    /**
-     * redis(JedisClient).
-     */
-    jedis,
-    /**
-     * redis(RedisTemplate).
-     */
-    redistemplate
-  }
-
-  public enum HttpClientType {
-    /**
-     * HttpClient.
-     */
-    httpclient
-  }
-
-  @Data
-  public static class RedisProperties implements Serializable {
-    private static final long serialVersionUID = -5924815351660074401L;
-
-    /**
-     * 主机地址.
-     */
-    private String host;
-
-    /**
-     * 端口号.
-     */
-    private int port = 6379;
-
-    /**
-     * 密码.
-     */
-    private String password;
-
-    /**
-     * 超时.
-     */
-    private int timeout = 2000;
-
-    /**
-     * 数据库.
-     */
-    private int database = 0;
-
-    private Integer maxActive;
-    private Integer maxIdle;
-    private Integer maxWaitMillis;
-    private Integer minIdle;
-  }
 }

From edf1401dbee5e6c25afef780745b1afcd5a69939 Mon Sep 17 00:00:00 2001
From: wzw921001 <756568809@qq.com>
Date: Tue, 26 May 2020 17:41:47 +0800
Subject: [PATCH 04/90] =?UTF-8?q?:art:=20#1583=20=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E8=AF=BB=E5=8F=96=E6=88=90=E5=91=98=E6=8E=A5?=
 =?UTF-8?q?=E5=8F=A3=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=9B=9E=E5=AD=97=E6=AE=B5?=
 =?UTF-8?q?=EF=BC=9Amain=5Fdepartment?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: laowang 
---
 .../src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java     | 1 +
 .../me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java   | 4 ++++
 2 files changed, 5 insertions(+)

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 07ecb4aa85..c44400a735 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
@@ -31,6 +31,7 @@ public class WxCpUser implements Serializable {
   private String email;
   private String avatar;
   private String thumbAvatar;
+  private String mainDepartment;
 
   /**
    * 地址。长度最大128个字符
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 e8bfd14b23..4ce0afda1c 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
@@ -74,6 +74,7 @@ public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationC
     user.setTelephone(GsonHelper.getString(o, "telephone"));
     user.setQrCode(GsonHelper.getString(o, "qr_code"));
     user.setToInvite(GsonHelper.getBoolean(o, "to_invite"));
+    user.setMainDepartment(GsonHelper.getString(o, "main_department"));
 
     if (GsonHelper.isNotNull(o.get(EXTRA_ATTR))) {
       this.buildExtraAttrs(o, user);
@@ -243,6 +244,9 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon
     if (user.getToInvite() != null) {
       o.addProperty("to_invite", user.getToInvite());
     }
+    if (user.getMainDepartment() != null) {
+      o.addProperty("main_department", user.getMainDepartment());
+    }
 
     if (user.getExtAttrs().size() > 0) {
       JsonArray attrsJsonArray = new JsonArray();

From da0ce15da6e382a6d43eea08af981f8ca9b5d267 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Tue, 26 May 2020 18:00:54 +0800
Subject: [PATCH 05/90] =?UTF-8?q?:art:=20#1585=20=E5=BE=AE=E4=BF=A1?=
 =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=BB=93=E6=9E=9C=E5=BC=82=E6=AD=A5=E9=80=9A?=
 =?UTF-8?q?=E7=9F=A5=E7=9A=84=E8=A7=A3=E6=9E=90=E6=96=B9=E6=B3=95=E5=A2=9E?=
 =?UTF-8?q?=E5=8A=A0=E5=8F=AF=E4=BB=A5=E8=87=AA=E8=A1=8C=E6=8C=87=E5=AE=9A?=
 =?UTF-8?q?signType=E7=9A=84=E9=87=8D=E8=BD=BD=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../github/binarywang/wxpay/service/WxPayService.java | 11 +++++++++++
 .../wxpay/service/impl/BaseWxPayServiceImpl.java      | 11 ++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

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 74958c1f91..2c5ad12f70 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
@@ -303,6 +303,17 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
    */
   WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData) throws WxPayException;
 
+  /**
+   * 解析支付结果通知.
+   * 详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
+   *
+   * @param xmlData  the xml data
+   * @param signType 签名类型
+   * @return the wx pay order notify result
+   * @throws WxPayException the wx pay exception
+   */
+  WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData, String signType) throws WxPayException;
+
   /**
    * 解析退款结果通知
    * 详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=9
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 4d61522f58..81082a3aa6 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
@@ -154,11 +154,20 @@ public WxPayRefundQueryResult refundQuery(WxPayRefundQueryRequest request) throw
 
   @Override
   public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData) throws WxPayException {
+    return this.parseOrderNotifyResult(xmlData, null);
+  }
+
+  @Override
+  public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData, String signType) throws WxPayException {
     try {
       log.debug("微信支付异步通知请求参数:{}", xmlData);
       WxPayOrderNotifyResult result = WxPayOrderNotifyResult.fromXML(xmlData);
+      if (result.getSignType() != null) {
+        // 如果解析的通知对象中signType有值,则使用它进行验签
+        signType = result.getSignType();
+      }
       log.debug("微信支付异步通知请求解析后的对象:{}", result);
-      result.checkResult(this, result.getSignType(), false);
+      result.checkResult(this, signType, false);
       return result;
     } catch (WxPayException e) {
       throw e;

From b95045b3a7fbc7fa705c7413231fb349e51f47dc Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Thu, 28 May 2020 22:12:18 +0800
Subject: [PATCH 06/90] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E9=94=99?=
 =?UTF-8?q?=E8=AF=AF=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wxjava/mp/config/WxMpServiceAutoConfiguration.java        | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java
index 17d1083ed6..f46ebf8dc1 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java
@@ -25,9 +25,9 @@ public WxMpService wxMpService(WxMpConfigStorage configStorage, WxMpProperties w
     WxMpProperties.HttpClientType httpClientType = wxMpProperties.getConfigStorage().getHttpClientType();
     WxMpService wxMpService;
     if (httpClientType == WxMpProperties.HttpClientType.okhttp) {
-      wxMpService = newWxMpServiceJoddHttpImpl();
-    } else if (httpClientType == WxMpProperties.HttpClientType.joddhttp) {
       wxMpService = newWxMpServiceOkHttpImpl();
+    } else if (httpClientType == WxMpProperties.HttpClientType.joddhttp) {
+      wxMpService = newWxMpServiceJoddHttpImpl();
     } else if (httpClientType == WxMpProperties.HttpClientType.httpclient) {
       wxMpService = newWxMpServiceHttpClientImpl();
     } else {

From eb6a578e1e07afc94652baee8e4ef1b4e86e5bb8 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Thu, 28 May 2020 22:32:18 +0800
Subject: [PATCH 07/90] =?UTF-8?q?:art:=20=E8=A7=84=E8=8C=83=E4=BC=98?=
 =?UTF-8?q?=E5=8C=96=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coupon/WxPayCouponInfoQueryResult.java    | 32 ++++++------
 .../bean/coupon/WxPayCouponSendResult.java    | 18 +++----
 .../coupon/WxPayCouponStockQueryResult.java   | 26 +++++-----
 .../bean/entpay/EntPayBankQueryResult.java    | 20 +++----
 .../wxpay/bean/entpay/EntPayBankResult.java   |  8 +--
 .../wxpay/bean/entpay/EntPayQueryResult.java  | 20 +++----
 .../bean/entpay/EntPayRedpackQueryResult.java | 34 ++++++------
 .../bean/entpay/EntPayRedpackResult.java      | 16 +++---
 .../wxpay/bean/entpay/EntPayResult.java       | 12 ++---
 .../wxpay/bean/entpay/GetPublicKeyResult.java |  4 +-
 .../bean/notify/WxPayOrderNotifyResult.java   | 44 ++++++++--------
 .../bean/notify/WxPayRefundNotifyResult.java  | 28 +++++-----
 .../bean/notify/WxScanPayNotifyResult.java    |  6 +--
 .../ProfitSharingQueryResult.java             | 16 +++---
 .../ProfitSharingReceiverResult.java          |  3 +-
 .../profitsharing/ProfitSharingResult.java    |  6 +--
 .../ProfitSharingReturnResult.java            | 22 ++++----
 .../wxpay/bean/result/BaseWxPayResult.java    | 52 +++++++++++--------
 .../result/WxPayAuthcode2OpenidResult.java    |  2 +-
 .../bean/result/WxPayFaceAuthInfoResult.java  |  4 +-
 .../wxpay/bean/result/WxPayFacepayResult.java | 34 ++++++------
 .../bean/result/WxPayMicropayResult.java      | 30 +++++------
 .../bean/result/WxPayOrderCloseResult.java    |  2 +-
 .../bean/result/WxPayOrderQueryResult.java    | 38 +++++++-------
 .../bean/result/WxPayOrderReverseResult.java  |  2 +-
 .../bean/result/WxPayRedpackQueryResult.java  | 34 ++++++------
 .../bean/result/WxPayRefundQueryResult.java   | 16 +++---
 .../wxpay/bean/result/WxPayRefundResult.java  | 28 +++++-----
 .../result/WxPaySandboxSignKeyResult.java     |  2 +-
 .../WxPaySendMiniProgramRedpackResult.java    | 12 ++---
 .../bean/result/WxPaySendRedpackResult.java   | 12 ++---
 .../bean/result/WxPayShorturlResult.java      |  2 +-
 .../bean/result/WxPayUnifiedOrderResult.java  |  8 +--
 33 files changed, 301 insertions(+), 292 deletions(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
index 9001541b7a..4c349206fa 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
@@ -230,21 +230,21 @@ public class WxPayCouponInfoQueryResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    deviceInfo = readXMLString(d, "device_info");
-    couponStockId = readXMLString(d, "coupon_stock_id");
-    couponId = readXMLString(d, "coupon_id");
-    couponValue = readXMLInteger(d, "coupon_value");
-    couponMinimum = readXMLInteger(d, "coupon_minimum");
-    couponName = readXMLString(d, "coupon_name");
-    couponState = readXMLString(d, "coupon_state");
-    couponDesc = readXMLString(d, "coupon_desc");
-    couponUseValue = readXMLInteger(d, "coupon_use_value");
-    couponRemainValue = readXMLInteger(d, "coupon_remain_value");
-    beginTime = readXMLString(d, "begin_time");
-    endTime = readXMLString(d, "end_time");
-    sendTime = readXMLString(d, "send_time");
-    consumerMchId = readXMLString(d, "consumer_mch_id");
-    sendSource = readXMLString(d, "send_source");
-    isPartialUse = readXMLString(d, "is_partial_use");
+    deviceInfo = readXmlString(d, "device_info");
+    couponStockId = readXmlString(d, "coupon_stock_id");
+    couponId = readXmlString(d, "coupon_id");
+    couponValue = readXmlInteger(d, "coupon_value");
+    couponMinimum = readXmlInteger(d, "coupon_minimum");
+    couponName = readXmlString(d, "coupon_name");
+    couponState = readXmlString(d, "coupon_state");
+    couponDesc = readXmlString(d, "coupon_desc");
+    couponUseValue = readXmlInteger(d, "coupon_use_value");
+    couponRemainValue = readXmlInteger(d, "coupon_remain_value");
+    beginTime = readXmlString(d, "begin_time");
+    endTime = readXmlString(d, "end_time");
+    sendTime = readXmlString(d, "send_time");
+    consumerMchId = readXmlString(d, "consumer_mch_id");
+    sendSource = readXmlString(d, "send_source");
+    isPartialUse = readXmlString(d, "is_partial_use");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponSendResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponSendResult.java
index 9350e58847..e6b40a6fad 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponSendResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponSendResult.java
@@ -139,14 +139,14 @@ public class WxPayCouponSendResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    deviceInfo = readXMLString(d, "device_info");
-    couponStockId = readXMLString(d, "coupon_stock_id");
-    respCount = readXMLInteger(d, "resp_count");
-    successCount = readXMLInteger(d, "success_count");
-    failedCount = readXMLInteger(d, "failed_count");
-    openid = readXMLString(d, "openid");
-    retCode = readXMLString(d, "ret_code");
-    couponId = readXMLString(d, "coupon_id");
-    retMsg = readXMLString(d, "ret_msg");
+    deviceInfo = readXmlString(d, "device_info");
+    couponStockId = readXmlString(d, "coupon_stock_id");
+    respCount = readXmlInteger(d, "resp_count");
+    successCount = readXmlInteger(d, "success_count");
+    failedCount = readXmlInteger(d, "failed_count");
+    openid = readXmlString(d, "openid");
+    retCode = readXmlString(d, "ret_code");
+    couponId = readXmlString(d, "coupon_id");
+    retMsg = readXmlString(d, "ret_msg");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponStockQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponStockQueryResult.java
index b338f4081b..9de99ffd22 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponStockQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponStockQueryResult.java
@@ -194,18 +194,18 @@ public class WxPayCouponStockQueryResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    deviceInfo = readXMLString(d, "device_info");
-    couponStockId = readXMLString(d, "coupon_stock_id");
-    couponName = readXMLString(d, "coupon_name");
-    couponValue = readXMLInteger(d, "coupon_value");
-    couponMinimum = readXMLInteger(d, "coupon_mininumn");
-    couponStockStatus = readXMLInteger(d, "coupon_stock_status");
-    couponTotal = readXMLInteger(d, "coupon_total");
-    maxQuota = readXMLInteger(d, "max_quota");
-    isSendNum = readXMLInteger(d, "is_send_num");
-    beginTime = readXMLString(d, "begin_time");
-    endTime = readXMLString(d, "end_time");
-    createTime = readXMLString(d, "create_time");
-    couponBudget = readXMLInteger(d, "coupon_budget");
+    deviceInfo = readXmlString(d, "device_info");
+    couponStockId = readXmlString(d, "coupon_stock_id");
+    couponName = readXmlString(d, "coupon_name");
+    couponValue = readXmlInteger(d, "coupon_value");
+    couponMinimum = readXmlInteger(d, "coupon_mininumn");
+    couponStockStatus = readXmlInteger(d, "coupon_stock_status");
+    couponTotal = readXmlInteger(d, "coupon_total");
+    maxQuota = readXmlInteger(d, "max_quota");
+    isSendNum = readXmlInteger(d, "is_send_num");
+    beginTime = readXmlString(d, "begin_time");
+    endTime = readXmlString(d, "end_time");
+    createTime = readXmlString(d, "create_time");
+    couponBudget = readXmlInteger(d, "coupon_budget");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankQueryResult.java
index 72adc1c9aa..98438334fa 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankQueryResult.java
@@ -96,15 +96,15 @@ public class EntPayBankQueryResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    partnerTradeNo = readXMLString(d, "partner_trade_no");
-    paymentNo = readXMLString(d, "payment_no");
-    bankNoMd5 = readXMLString(d, "bank_no_md5");
-    trueNameMd5 = readXMLString(d, "true_name_md5");
-    amount = readXMLInteger(d, "amount");
-    status = readXMLString(d, "status");
-    cmmsAmount = readXMLInteger(d, "cmms_amt");
-    createTime = readXMLString(d, "create_time");
-    paySuccessTime = readXMLString(d, "pay_succ_time");
-    failReason = readXMLString(d, "reason");
+    partnerTradeNo = readXmlString(d, "partner_trade_no");
+    paymentNo = readXmlString(d, "payment_no");
+    bankNoMd5 = readXmlString(d, "bank_no_md5");
+    trueNameMd5 = readXmlString(d, "true_name_md5");
+    amount = readXmlInteger(d, "amount");
+    status = readXmlString(d, "status");
+    cmmsAmount = readXmlInteger(d, "cmms_amt");
+    createTime = readXmlString(d, "create_time");
+    paySuccessTime = readXmlString(d, "pay_succ_time");
+    failReason = readXmlString(d, "reason");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankResult.java
index 0d38645afe..fae51d0aad 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankResult.java
@@ -51,9 +51,9 @@ public class EntPayBankResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    amount = readXMLInteger(d, "amount");
-    partnerTradeNo = readXMLString(d, "partner_trade_no");
-    paymentNo = readXMLString(d, "payment_no");
-    cmmsAmount = readXMLInteger(d, "cmms_amt");
+    amount = readXmlInteger(d, "amount");
+    partnerTradeNo = readXmlString(d, "partner_trade_no");
+    paymentNo = readXmlString(d, "payment_no");
+    cmmsAmount = readXmlInteger(d, "cmms_amt");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryResult.java
index 6dee1d0911..bf4efac5df 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryResult.java
@@ -84,15 +84,15 @@ public class EntPayQueryResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    partnerTradeNo = readXMLString(d, "partner_trade_no");
-    detailId = readXMLString(d, "detail_id");
-    status = readXMLString(d, "status");
-    reason = readXMLString(d, "reason");
-    openid = readXMLString(d, "openid");
-    transferName = readXMLString(d, "transfer_name");
-    paymentAmount = readXMLInteger(d, "payment_amount");
-    transferTime = readXMLString(d, "transfer_time");
-    paymentTime = readXMLString(d, "payment_time");
-    desc = readXMLString(d, "desc");
+    partnerTradeNo = readXmlString(d, "partner_trade_no");
+    detailId = readXmlString(d, "detail_id");
+    status = readXmlString(d, "status");
+    reason = readXmlString(d, "reason");
+    openid = readXmlString(d, "openid");
+    transferName = readXmlString(d, "transfer_name");
+    paymentAmount = readXmlInteger(d, "payment_amount");
+    transferTime = readXmlString(d, "transfer_time");
+    paymentTime = readXmlString(d, "payment_time");
+    desc = readXmlString(d, "desc");
   }
 }
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 000498519f..9488c32aa8 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
@@ -133,22 +133,22 @@ public class EntPayRedpackQueryResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    mchBillNo = readXMLString(d, "mch_billno");
-    detailId = readXMLString(d, "detailId");
-    status = readXMLString(d, "status");
-    sendType = readXMLString(d, "send_type");
-    totalAmount = readXMLInteger(d, "total_amount");
-    reason = readXMLInteger(d, "reason");
-    sendTime = readXMLString(d, "send_time");
-    refundTime = readXMLString(d, "refund_time");
-    refundAmount = readXMLInteger(d, "refund_amount");
-    wishing = readXMLString(d, "wishing");
-    remark = readXMLString(d, "remark");
-    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");
+    mchBillNo = readXmlString(d, "mch_billno");
+    detailId = readXmlString(d, "detailId");
+    status = readXmlString(d, "status");
+    sendType = readXmlString(d, "send_type");
+    totalAmount = readXmlInteger(d, "total_amount");
+    reason = readXmlInteger(d, "reason");
+    sendTime = readXmlString(d, "send_time");
+    refundTime = readXmlString(d, "refund_time");
+    refundAmount = readXmlInteger(d, "refund_amount");
+    wishing = readXmlString(d, "wishing");
+    remark = readXmlString(d, "remark");
+    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");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java
index 98cce357c9..a2bf3df7e0 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java
@@ -81,13 +81,13 @@ public class EntPayRedpackResult extends BaseWxPayResult implements Serializable
 
   @Override
   protected void loadXML(Document d) {
-    mchBillNo = readXMLString(d, "mch_billno");
-    mchId = readXMLString(d, "mch_id");
-    wxAppId = readXMLString(d, "wxappid");
-    reOpenid = readXMLString(d, "re_openid");
-    totalAmount = readXMLString(d, "totalAmount");
-    sendListId = readXMLString(d, "sendListid");
-    senderName = readXMLString(d, "sender_name");
-    senderHeaderMediaId = readXMLString(d, "sender_header_media_id");
+    mchBillNo = readXmlString(d, "mch_billno");
+    mchId = readXmlString(d, "mch_id");
+    wxAppId = readXmlString(d, "wxappid");
+    reOpenid = readXmlString(d, "re_openid");
+    totalAmount = readXmlString(d, "totalAmount");
+    sendListId = readXmlString(d, "sendListid");
+    senderName = readXmlString(d, "sender_name");
+    senderHeaderMediaId = readXmlString(d, "sender_header_media_id");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayResult.java
index 23a3cb7f23..7691e4d4a9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayResult.java
@@ -61,11 +61,11 @@ public class EntPayResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    mchId = readXMLString(d, "mchid");
-    mchAppid = readXMLString(d, "mch_appid");
-    deviceInfo = readXMLString(d, "device_info");
-    partnerTradeNo = readXMLString(d, "partner_trade_no");
-    paymentNo = readXMLString(d, "payment_no");
-    paymentTime = readXMLString(d, "payment_time");
+    mchId = readXmlString(d, "mchid");
+    mchAppid = readXmlString(d, "mch_appid");
+    deviceInfo = readXmlString(d, "device_info");
+    partnerTradeNo = readXmlString(d, "partner_trade_no");
+    paymentNo = readXmlString(d, "payment_no");
+    paymentTime = readXmlString(d, "payment_time");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/GetPublicKeyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/GetPublicKeyResult.java
index 2a9cc8c6ad..7e793bbf0a 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/GetPublicKeyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/GetPublicKeyResult.java
@@ -32,7 +32,7 @@ public class GetPublicKeyResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    mchId = readXMLString(d, "mch_id");
-    pubKey = readXMLString(d, "pub_key");
+    mchId = readXmlString(d, "mch_id");
+    pubKey = readXmlString(d, "pub_key");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResult.java
index b1a8fe9d2d..976bf12bb1 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResult.java
@@ -353,28 +353,28 @@ public Map toMap() {
 
   @Override
   protected void loadXML(Document d) {
-    promotionDetail = readXMLString(d, "promotion_detail");
-    deviceInfo = readXMLString(d, "device_info");
-    openid = readXMLString(d, "openid");
-    isSubscribe = readXMLString(d, "is_subscribe");
-    subOpenid = readXMLString(d, "sub_openid");
-    subIsSubscribe = readXMLString(d, "sub_is_subscribe");
-    tradeType = readXMLString(d, "trade_type");
-    bankType = readXMLString(d, "bank_type");
-    totalFee = readXMLInteger(d, "total_fee");
-    settlementTotalFee = readXMLInteger(d, "settlement_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");
-    version = readXMLString(d, "version");
-    rateValue = readXMLString(d, "rate_value");
-    signType = readXMLString(d, "sign_type");
+    promotionDetail = readXmlString(d, "promotion_detail");
+    deviceInfo = readXmlString(d, "device_info");
+    openid = readXmlString(d, "openid");
+    isSubscribe = readXmlString(d, "is_subscribe");
+    subOpenid = readXmlString(d, "sub_openid");
+    subIsSubscribe = readXmlString(d, "sub_is_subscribe");
+    tradeType = readXmlString(d, "trade_type");
+    bankType = readXmlString(d, "bank_type");
+    totalFee = readXmlInteger(d, "total_fee");
+    settlementTotalFee = readXmlInteger(d, "settlement_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");
+    version = readXmlString(d, "version");
+    rateValue = readXmlString(d, "rate_value");
+    signType = readXmlString(d, "sign_type");
 
     composeCoupons();
   }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java
index d9f4cbd5f8..6c650d1434 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java
@@ -86,7 +86,7 @@ public static WxPayRefundNotifyResult fromXML(String xmlString, String mchKey) t
 
   @Override
   protected void loadXML(Document d) {
-    reqInfoString = readXMLString(d, "req_info");
+    reqInfoString = readXmlString(d, "req_info");
   }
 
   /**
@@ -314,19 +314,19 @@ public static ReqInfo fromXML(String xmlString) {
     }
 
     public void loadXML(Document d) {
-      transactionId = readXMLString(d, "transaction_id");
-      outTradeNo = readXMLString(d, "out_trade_no");
-      refundId = readXMLString(d, "refund_id");
-      outRefundNo = readXMLString(d, "out_refund_no");
-      totalFee = readXMLInteger(d, "total_fee");
-      settlementTotalFee = readXMLInteger(d, "settlement_total_fee");
-      refundFee = readXMLInteger(d, "refund_fee");
-      settlementRefundFee = readXMLInteger(d, "settlement_refund_fee");
-      refundStatus = readXMLString(d, "refund_status");
-      successTime = readXMLString(d, "success_time");
-      refundRecvAccout = readXMLString(d, "refund_recv_accout");
-      refundAccount = readXMLString(d, "refund_account");
-      refundRequestSource = readXMLString(d, "refund_request_source");
+      transactionId = readXmlString(d, "transaction_id");
+      outTradeNo = readXmlString(d, "out_trade_no");
+      refundId = readXmlString(d, "refund_id");
+      outRefundNo = readXmlString(d, "out_refund_no");
+      totalFee = readXmlInteger(d, "total_fee");
+      settlementTotalFee = readXmlInteger(d, "settlement_total_fee");
+      refundFee = readXmlInteger(d, "refund_fee");
+      settlementRefundFee = readXmlInteger(d, "settlement_refund_fee");
+      refundStatus = readXmlString(d, "refund_status");
+      successTime = readXmlString(d, "success_time");
+      refundRecvAccout = readXmlString(d, "refund_recv_accout");
+      refundAccount = readXmlString(d, "refund_account");
+      refundRequestSource = readXmlString(d, "refund_request_source");
     }
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxScanPayNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxScanPayNotifyResult.java
index 9c9c451372..d144a4b552 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxScanPayNotifyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxScanPayNotifyResult.java
@@ -48,9 +48,9 @@ public class WxScanPayNotifyResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    openid = readXMLString(d, "openid");
-    isSubscribe = readXMLString(d, "is_subscribe");
-    productId = readXMLString(d, "product_id");
+    openid = readXmlString(d, "openid");
+    isSubscribe = readXmlString(d, "is_subscribe");
+    productId = readXmlString(d, "product_id");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java
index 03dd6b212a..5657d6ae89 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java
@@ -80,14 +80,14 @@ public List formatReceivers() {
 
   @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");
-    closeReason = readXMLString(d, "close_reason");
-    receiversJson = readXMLString(d, "receivers");
-    amount = readXMLInteger(d, "amount");
-    description = readXMLString(d, "description");
+    transactionId = readXmlString(d, "transaction_id");
+    outOrderNo = readXmlString(d, "out_order_no");
+    orderId = readXmlString(d, "order_id");
+    status = readXmlString(d, "status");
+    closeReason = readXmlString(d, "close_reason");
+    receiversJson = readXmlString(d, "receivers");
+    amount = readXmlInteger(d, "amount");
+    description = readXmlString(d, "description");
   }
 
   @Data
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java
index 806632fe54..1a048df363 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java
@@ -1,6 +1,5 @@
 package com.github.binarywang.wxpay.bean.profitsharing;
 
-import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
 import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.Data;
@@ -26,6 +25,6 @@ public class ProfitSharingReceiverResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    receiver = readXMLString(d, "receiver");
+    receiver = readXmlString(d, "receiver");
   }
 }
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 daea0e64db..0ca430ab3c 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
@@ -34,8 +34,8 @@ public class ProfitSharingResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    transactionId = readXMLString(d, "transaction_id");
-    outOrderNo = readXMLString(d, "out_order_no");
-    orderId = readXMLString(d, "order_id");
+    transactionId = readXmlString(d, "transaction_id");
+    outOrderNo = readXmlString(d, "out_order_no");
+    orderId = readXmlString(d, "order_id");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java
index 2828d4ab82..d0531b61e9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java
@@ -75,16 +75,16 @@ public class ProfitSharingReturnResult extends BaseWxPayResult {
 
   @Override
   protected void loadXML(Document d) {
-    orderId = readXMLString(d, "order_id");
-    outOrderNo = readXMLString(d, "out_order_no");
-    outReturnNo = readXMLString(d, "out_return_no");
-    returnNo = readXMLString(d, "return_no");
-    returnAccountType = readXMLString(d, "return_account_type");
-    returnAccount = readXMLString(d, "return_account");
-    returnAmount = readXMLInteger(d, "return_amount");
-    description = readXMLString(d, "description");
-    result = readXMLString(d, "result");
-    failReason = readXMLString(d, "fail_reason");
-    finishTime = readXMLString(d, "finish_time");
+    orderId = readXmlString(d, "order_id");
+    outOrderNo = readXmlString(d, "out_order_no");
+    outReturnNo = readXmlString(d, "out_return_no");
+    returnNo = readXmlString(d, "return_no");
+    returnAccountType = readXmlString(d, "return_account_type");
+    returnAccount = readXmlString(d, "return_account");
+    returnAmount = readXmlInteger(d, "return_amount");
+    description = readXmlString(d, "description");
+    result = readXmlString(d, "result");
+    failReason = readXmlString(d, "fail_reason");
+    finishTime = readXmlString(d, "finish_time");
   }
 }
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 d58f20fb18..bbba01bff4 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
@@ -43,6 +43,8 @@
  */
 @Data
 public abstract class BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = -3559552761816864481L;
+  
   /**
    * 返回状态码.
    */
@@ -165,39 +167,45 @@ public static  T fromXML(String xmlString, Class c
    * @param d Document
    */
   private void loadBasicXML(Document d) {
-    returnCode = readXMLString(d, "return_code");
-    returnMsg = readXMLString(d, "return_msg");
-    resultCode = readXMLString(d, "result_code");
-    errCode = readXMLString(d, "err_code");
-    errCodeDes = readXMLString(d, "err_code_des");
-    appid = readXMLString(d, "appid");
-    mchId = readXMLString(d, "mch_id");
-    subAppId = readXMLString(d, "sub_appid");
-    subMchId = readXMLString(d, "sub_mch_id");
-    nonceStr = readXMLString(d, "nonce_str");
-    sign = readXMLString(d, "sign");
+    returnCode = readXmlString(d, "return_code");
+    returnMsg = readXmlString(d, "return_msg");
+    resultCode = readXmlString(d, "result_code");
+    errCode = readXmlString(d, "err_code");
+    errCodeDes = readXmlString(d, "err_code_des");
+    appid = readXmlString(d, "appid");
+    mchId = readXmlString(d, "mch_id");
+    subAppId = readXmlString(d, "sub_appid");
+    subMchId = readXmlString(d, "sub_mch_id");
+    nonceStr = readXmlString(d, "nonce_str");
+    sign = readXmlString(d, "sign");
   }
 
-  public static Integer readXMLInteger(Node d, String tagName) {
-    String content = readXMLString(d, tagName);
-    if (content == null || content.trim().length() == 0) return null;
+  protected static Integer readXmlInteger(Node d, String tagName) {
+    String content = readXmlString(d, tagName);
+    if (content == null || content.trim().length() == 0) {
+      return null;
+    }
     return Integer.parseInt(content);
   }
 
-  public static String readXMLString(Node d, String tagName) {
-    if (!d.hasChildNodes()) return null;
+  protected static String readXmlString(Node d, String tagName) {
+    if (!d.hasChildNodes()) {
+      return null;
+    }
     NodeList childNodes = d.getChildNodes();
     for (int i = 0, j = childNodes.getLength(); i < j; i++) {
       Node node = childNodes.item(i);
       if (tagName.equals(node.getNodeName())) {
-        if (!node.hasChildNodes()) return null;
+        if (!node.hasChildNodes()) {
+          return null;
+        }
         return node.getFirstChild().getNodeValue();
       }
     }
     return null;
   }
 
-  public static String readXMLString(Document d, String tagName) {
+  public static String readXmlString(Document d, String tagName) {
     NodeList elements = d.getElementsByTagName(tagName);
     if (elements == null || elements.getLength() == 0) {
       return null;
@@ -210,9 +218,11 @@ public static String readXMLString(Document d, String tagName) {
     return node.getNodeValue();
   }
 
-  public static Integer readXMLInteger(Document d, String tagName) {
-    String content = readXMLString(d, tagName);
-    if (content == null || content.trim().length() == 0) return null;
+  protected static Integer readXmlInteger(Document d, String tagName) {
+    String content = readXmlString(d, tagName);
+    if (content == null || content.trim().length() == 0) {
+      return null;
+    }
     return Integer.parseInt(content);
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
index 76526ff685..5bcc77d406 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
@@ -38,7 +38,7 @@ public class WxPayAuthcode2OpenidResult extends BaseWxPayResult {
    */
   @Override
   protected void loadXML(Document d) {
-    openid = readXMLString(d, "openid");
+    openid = readXmlString(d, "openid");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java
index 53adb40d7a..3a8ab40eae 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java
@@ -42,8 +42,8 @@ public class WxPayFaceAuthInfoResult extends BaseWxPayResult implements Serializ
    */
   @Override
   protected void loadXML(Document d) {
-    authinfo = readXMLString(d, "authinfo");
-    expiresIn = readXMLString(d, "expires_in");
+    authinfo = readXmlString(d, "authinfo");
+    expiresIn = readXmlString(d, "expires_in");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
index c19a92c488..989ba7f0c5 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
@@ -250,23 +250,23 @@ public class WxPayFacepayResult extends BaseWxPayResult {
    */
   @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");
-    subsSubscribe = readXMLString(d, "sub_is_subscribe");
-    tradeType = readXMLString(d, "trade_type");
-    bankType = readXMLString(d, "bank_type");
-    feeType = readXMLString(d, "fee_type");
-    totalFee = readXMLInteger(d, "total_fee");
-    cashFeeType = readXMLString(d, "cash_fee_type");
-    cashFee = readXMLInteger(d, "cash_fee");
-    transactionId = readXMLString(d, "transaction_id");
-    outTradeNo = readXMLString(d, "out_trade_no");
-    detail = readXMLString(d, "detail");
-    attach = readXMLString(d, "attach");
-    promotionDetail = readXMLString(d, "promotion_detail");
-    timeEnd = readXMLString(d, "time_end");
+    deviceInfo = readXmlString(d, "device_info");
+    openid = readXmlString(d, "openid");
+    isSubscribe = readXmlString(d, "is_subscribe");
+    subOpenid = readXmlString(d, "sub_openid");
+    subsSubscribe = readXmlString(d, "sub_is_subscribe");
+    tradeType = readXmlString(d, "trade_type");
+    bankType = readXmlString(d, "bank_type");
+    feeType = readXmlString(d, "fee_type");
+    totalFee = readXmlInteger(d, "total_fee");
+    cashFeeType = readXmlString(d, "cash_fee_type");
+    cashFee = readXmlInteger(d, "cash_fee");
+    transactionId = readXmlString(d, "transaction_id");
+    outTradeNo = readXmlString(d, "out_trade_no");
+    detail = readXmlString(d, "detail");
+    attach = readXmlString(d, "attach");
+    promotionDetail = readXmlString(d, "promotion_detail");
+    timeEnd = readXmlString(d, "time_end");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
index b7de7ffec1..6a2a0630fc 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
@@ -223,21 +223,21 @@ public class WxPayMicropayResult extends BaseWxPayResult {
    */
   @Override
   protected void loadXML(Document d) {
-    openid = readXMLString(d, "openid");
-    isSubscribe = readXMLString(d, "is_subscribe");
-    tradeType = readXMLString(d, "trade_type");
-    bankType = readXMLString(d, "bank_type");
-    feeType = readXMLString(d, "fee_type");
-    totalFee = readXMLInteger(d, "total_fee");
-    settlementTotalFee = readXMLInteger(d, "settlement_total_fee");
-    couponFee = readXMLInteger(d, "coupon_fee");
-    cashFeeType = readXMLString(d, "cash_fee_type");
-    cashFee = readXMLInteger(d, "cash_fee");
-    transactionId = readXMLString(d, "transaction_id");
-    outTradeNo = readXMLString(d, "out_trade_no");
-    attach = readXMLString(d, "attach");
-    timeEnd = readXMLString(d, "time_end");
-    promotionDetail = readXMLString(d, "promotion_detail");
+    openid = readXmlString(d, "openid");
+    isSubscribe = readXmlString(d, "is_subscribe");
+    tradeType = readXmlString(d, "trade_type");
+    bankType = readXmlString(d, "bank_type");
+    feeType = readXmlString(d, "fee_type");
+    totalFee = readXmlInteger(d, "total_fee");
+    settlementTotalFee = readXmlInteger(d, "settlement_total_fee");
+    couponFee = readXmlInteger(d, "coupon_fee");
+    cashFeeType = readXmlString(d, "cash_fee_type");
+    cashFee = readXmlInteger(d, "cash_fee");
+    transactionId = readXmlString(d, "transaction_id");
+    outTradeNo = readXmlString(d, "out_trade_no");
+    attach = readXmlString(d, "attach");
+    timeEnd = readXmlString(d, "time_end");
+    promotionDetail = readXmlString(d, "promotion_detail");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
index a098cbb5fc..0810816c13 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
@@ -33,7 +33,7 @@ public class WxPayOrderCloseResult extends BaseWxPayResult {
    */
   @Override
   protected void loadXML(Document d) {
-    resultMsg = readXMLString(d, "result_msg");
+    resultMsg = readXmlString(d, "result_msg");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
index 2737dc2a6b..2bc97ff080 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
@@ -342,25 +342,25 @@ public void composeCoupons() {
    */
   @Override
   protected void loadXML(Document d) {
-    promotionDetail = readXMLString(d, "promotion_detail");
-    deviceInfo = readXMLString(d, "device_info");
-    openid = readXMLString(d, "openid");
-    isSubscribe = readXMLString(d, "is_subscribe");
-    tradeType = readXMLString(d, "trade_type");
-    tradeState = readXMLString(d, "trade_state");
-    bankType = readXMLString(d, "bank_type");
-    totalFee = readXMLInteger(d, "total_fee");
-    settlementTotalFee = readXMLInteger(d, "settlement_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");
-    this.transactionId = readXMLString(d, "transaction_id");
-    this.outTradeNo = readXMLString(d, "out_trade_no");
-    this.attach = readXMLString(d, "attach");
-    this.timeEnd = readXMLString(d, "time_end");
-    this.tradeStateDesc = readXMLString(d, "trade_state_desc");
+    promotionDetail = readXmlString(d, "promotion_detail");
+    deviceInfo = readXmlString(d, "device_info");
+    openid = readXmlString(d, "openid");
+    isSubscribe = readXmlString(d, "is_subscribe");
+    tradeType = readXmlString(d, "trade_type");
+    tradeState = readXmlString(d, "trade_state");
+    bankType = readXmlString(d, "bank_type");
+    totalFee = readXmlInteger(d, "total_fee");
+    settlementTotalFee = readXmlInteger(d, "settlement_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");
+    this.transactionId = readXmlString(d, "transaction_id");
+    this.outTradeNo = readXmlString(d, "out_trade_no");
+    this.attach = readXmlString(d, "attach");
+    this.timeEnd = readXmlString(d, "time_end");
+    this.tradeStateDesc = readXmlString(d, "trade_state_desc");
   }
 
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
index 210e9e4aab..77ad086be0 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
@@ -40,7 +40,7 @@ public class WxPayOrderReverseResult extends BaseWxPayResult {
    */
   @Override
   protected void loadXML(Document d) {
-    isRecall = readXMLString(d, "recall");
+    isRecall = readXmlString(d, "recall");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
index 669e01f7fb..0f4e5a91ff 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
@@ -234,20 +234,20 @@ public class WxPayRedpackQueryResult extends BaseWxPayResult {
    */
   @Override
   protected void loadXML(Document d) {
-    mchBillNo = readXMLString(d, "mch_billno");
-    detailId = readXMLString(d, "detail_id");
-    status = readXMLString(d, "status");
-    sendType = readXMLString(d, "send_type");
-    hbType = readXMLString(d, "hb_type");
-    totalNum = readXMLInteger(d, "total_num");
-    totalAmount = readXMLInteger(d, "total_amount");
-    reason = readXMLString(d, "reason");
-    sendTime = readXMLString(d, "send_time");
-    refundTime = readXMLString(d, "refund_time");
-    refundAmount = readXMLInteger(d, "refund_amount");
-    wishing = readXMLString(d, "wishing");
-    remark = readXMLString(d, "remark");
-    actName = readXMLString(d, "act_name");
+    mchBillNo = readXmlString(d, "mch_billno");
+    detailId = readXmlString(d, "detail_id");
+    status = readXmlString(d, "status");
+    sendType = readXmlString(d, "send_type");
+    hbType = readXmlString(d, "hb_type");
+    totalNum = readXmlInteger(d, "total_num");
+    totalAmount = readXmlInteger(d, "total_amount");
+    reason = readXmlString(d, "reason");
+    sendTime = readXmlString(d, "send_time");
+    refundTime = readXmlString(d, "refund_time");
+    refundAmount = readXmlInteger(d, "refund_amount");
+    wishing = readXmlString(d, "wishing");
+    remark = readXmlString(d, "remark");
+    actName = readXmlString(d, "act_name");
 
     NodeList nodeList = d.getElementsByTagName("hbinfo");
     List list = new ArrayList<>(nodeList.getLength());
@@ -255,9 +255,9 @@ protected void loadXML(Document d) {
     for (int i = 0, j = nodeList.getLength(); i < j; i++) {
       Node node = nodeList.item(i);
       RedpackInfo rp = new RedpackInfo();
-      rp.amount = readXMLInteger(node, "amount");
-      rp.openid = readXMLString(node, "openid");
-      rp.receiveTime = readXMLString(node, "rcv_time");
+      rp.amount = readXmlInteger(node, "amount");
+      rp.openid = readXmlString(node, "openid");
+      rp.receiveTime = readXmlString(node, "rcv_time");
       list.add(rp);
     }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
index ecdf933b6b..9a60368f17 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
@@ -180,14 +180,14 @@ public void composeRefundRecords() {
    */
   @Override
   protected void loadXML(Document d) {
-    deviceInfo = readXMLString(d, "device_info");
-    transactionId = readXMLString(d, "transaction_id");
-    outTradeNo = readXMLString(d, "out_trade_no");
-    totalFee = readXMLInteger(d, "total_fee");
-    settlementTotalFee = readXMLInteger(d, "settlement_total_fee");
-    feeType = readXMLString(d, "fee_type");
-    cashFee = readXMLInteger(d, "cash_fee");
-    refundCount = readXMLInteger(d, "refund_count");
+    deviceInfo = readXmlString(d, "device_info");
+    transactionId = readXmlString(d, "transaction_id");
+    outTradeNo = readXmlString(d, "out_trade_no");
+    totalFee = readXmlInteger(d, "total_fee");
+    settlementTotalFee = readXmlInteger(d, "settlement_total_fee");
+    feeType = readXmlString(d, "fee_type");
+    cashFee = readXmlInteger(d, "cash_fee");
+    refundCount = readXmlInteger(d, "refund_count");
   }
 
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
index 57fb333595..cdb9fc70e0 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
@@ -148,20 +148,20 @@ public void composeRefundCoupons() {
    */
   @Override
   protected void loadXML(Document d) {
-    transactionId = readXMLString(d, "transaction_id");
-    outTradeNo = readXMLString(d, "out_trade_no");
-    outRefundNo = readXMLString(d, "out_refund_no");
-    refundId = readXMLString(d, "refund_id");
-    refundFee = readXMLInteger(d, "refund_fee");
-    settlementRefundFee = readXMLInteger(d, "settlement_refund_fee");
-    totalFee = readXMLInteger(d, "total_fee");
-    settlementTotalFee = readXMLInteger(d, "settlement_total_fee");
-    feeType = readXMLString(d, "fee_type");
-    cashFee = readXMLInteger(d, "cash_fee");
-    cashFeeType = readXMLString(d, "cash_fee_type");
-    cashRefundFee = readXMLInteger(d, "cash_refund_fee");
-    couponRefundCount = readXMLInteger(d, "coupon_refund_count");
-    couponRefundFee = readXMLInteger(d, "coupon_refund_fee");
+    transactionId = readXmlString(d, "transaction_id");
+    outTradeNo = readXmlString(d, "out_trade_no");
+    outRefundNo = readXmlString(d, "out_refund_no");
+    refundId = readXmlString(d, "refund_id");
+    refundFee = readXmlInteger(d, "refund_fee");
+    settlementRefundFee = readXmlInteger(d, "settlement_refund_fee");
+    totalFee = readXmlInteger(d, "total_fee");
+    settlementTotalFee = readXmlInteger(d, "settlement_total_fee");
+    feeType = readXmlString(d, "fee_type");
+    cashFee = readXmlInteger(d, "cash_fee");
+    cashFeeType = readXmlString(d, "cash_fee_type");
+    cashRefundFee = readXmlInteger(d, "cash_refund_fee");
+    couponRefundCount = readXmlInteger(d, "coupon_refund_count");
+    couponRefundFee = readXmlInteger(d, "coupon_refund_fee");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
index b1af69c6b0..dfa604ddfd 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
@@ -39,7 +39,7 @@ public class WxPaySandboxSignKeyResult extends BaseWxPayResult {
    */
   @Override
   protected void loadXML(Document d) {
-    sandboxSignKey = readXMLString(d, "sandbox_signkey");
+    sandboxSignKey = readXmlString(d, "sandbox_signkey");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
index c707fee7f1..c58e1c02a4 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
@@ -56,11 +56,11 @@ public class WxPaySendMiniProgramRedpackResult extends BaseWxPayResult implement
 
   @Override
   protected void loadXML(Document d) {
-    mchBillNo = readXMLString(d, "mch_billno");
-    wxAppid = readXMLString(d, "wxappid");
-    reOpenid = readXMLString(d, "re_openid");
-    totalAmount = readXMLInteger(d, "total_amount");
-    packageName = readXMLString(d, "package");
-    sendListId = readXMLString(d, "send_listid");
+    mchBillNo = readXmlString(d, "mch_billno");
+    wxAppid = readXmlString(d, "wxappid");
+    reOpenid = readXmlString(d, "re_openid");
+    totalAmount = readXmlInteger(d, "total_amount");
+    packageName = readXmlString(d, "package");
+    sendListId = readXmlString(d, "send_listid");
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
index 49390da897..fd786d9f25 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
@@ -46,12 +46,12 @@ public class WxPaySendRedpackResult extends BaseWxPayResult implements Serializa
    */
   @Override
   protected void loadXML(Document d) {
-    mchBillno = readXMLString(d, "mch_billno");
-    wxappid = readXMLString(d, "wxappid");
-    reOpenid = readXMLString(d, "re_openid");
-    totalAmount = readXMLInteger(d, "total_amount");
-    sendTime = readXMLString(d, "send_time");
-    sendListid = readXMLString(d, "send_listid");
+    mchBillno = readXmlString(d, "mch_billno");
+    wxappid = readXmlString(d, "wxappid");
+    reOpenid = readXmlString(d, "re_openid");
+    totalAmount = readXmlInteger(d, "total_amount");
+    sendTime = readXmlString(d, "send_time");
+    sendListid = readXmlString(d, "send_listid");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
index b213024edc..55463d6556 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
@@ -39,7 +39,7 @@ public class WxPayShorturlResult extends BaseWxPayResult {
    */
   @Override
   protected void loadXML(Document d) {
-    shortUrl = readXMLString(d, "short_url");
+    shortUrl = readXmlString(d, "short_url");
   }
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
index 3345f0c0fb..19e8be1cb1 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
@@ -51,10 +51,10 @@ public class WxPayUnifiedOrderResult extends BaseWxPayResult {
    */
   @Override
   protected void loadXML(Document d) {
-    prepayId = readXMLString(d, "prepay_id");
-    tradeType = readXMLString(d, "trade_type");
-    mwebUrl = readXMLString(d, "mweb_url");
-    codeURL = readXMLString(d, "code_url");
+    prepayId = readXmlString(d, "prepay_id");
+    tradeType = readXmlString(d, "trade_type");
+    mwebUrl = readXmlString(d, "mweb_url");
+    codeURL = readXmlString(d, "code_url");
   }
 
 }

From 1720e5137fef5731bbb090d211983d2886c7f963 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 30 May 2020 21:40:38 +0800
Subject: [PATCH 08/90] =?UTF-8?q?:art:=20=E5=BE=AE=E4=BF=A1=E7=8E=B0?=
 =?UTF-8?q?=E9=87=91=E7=BA=A2=E5=8C=85=E5=8F=91=E9=80=81=E6=8E=A5=E5=8F=A3?=
 =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=A4=84=E7=90=86=E4=BC=98=E5=8C=96=EF=BC=8C?=
 =?UTF-8?q?=E9=92=88=E5=AF=B9=E5=A4=84=E7=90=86=E4=B8=AD=E7=9A=84=E5=8F=98?=
 =?UTF-8?q?=E6=80=81=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E4=B8=8D=E6=8A=9B?=
 =?UTF-8?q?=E5=87=BA=E5=BC=82=E5=B8=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wxpay/bean/result/WxPaySendRedpackResult.java    | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
index fd786d9f25..f6293c07c6 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
@@ -1,5 +1,7 @@
 package com.github.binarywang.wxpay.bean.result;
 
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -54,4 +56,14 @@ protected void loadXML(Document d) {
     sendListid = readXmlString(d, "send_listid");
   }
 
+  @Override
+  public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException {
+    try {
+      super.checkResult(wxPayService, signType, checkSuccess);
+    } catch (WxPayException e) {
+      if (!"PROCESSING".equals(e.getErrCode())) {
+        throw e;
+      }
+    }
+  }
 }

From 6e2babd46bc1b20cd9adbde5d0f57fb9a21cfd55 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 30 May 2020 21:42:38 +0800
Subject: [PATCH 09/90] =?UTF-8?q?:art:=20=E8=A7=84=E8=8C=83=E4=BC=98?=
 =?UTF-8?q?=E5=8C=96=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coupon/WxPayCouponInfoQueryResult.java    |  2 +-
 .../bean/coupon/WxPayCouponSendResult.java    |  2 +-
 .../coupon/WxPayCouponStockQueryResult.java   |  2 +-
 .../bean/entpay/EntPayBankQueryResult.java    |  2 +-
 .../wxpay/bean/entpay/EntPayBankResult.java   |  2 +-
 .../wxpay/bean/entpay/EntPayQueryResult.java  |  2 +-
 .../bean/entpay/EntPayRedpackQueryResult.java |  2 +-
 .../bean/entpay/EntPayRedpackResult.java      |  2 +-
 .../wxpay/bean/entpay/EntPayResult.java       |  2 +-
 .../wxpay/bean/entpay/GetPublicKeyResult.java |  2 +-
 .../bean/notify/WxPayOrderNotifyResult.java   |  2 +-
 .../bean/notify/WxPayRefundNotifyResult.java  |  2 +-
 .../bean/notify/WxScanPayNotifyResult.java    |  2 +-
 .../ProfitSharingQueryResult.java             |  2 +-
 .../ProfitSharingReceiverResult.java          |  2 +-
 .../profitsharing/ProfitSharingResult.java    |  2 +-
 .../ProfitSharingReturnResult.java            |  2 +-
 .../wxpay/bean/result/BaseWxPayResult.java    |  7 ++++---
 .../result/WxPayAuthcode2OpenidResult.java    |  2 +-
 .../wxpay/bean/result/WxPayCommonResult.java  |  2 +-
 .../bean/result/WxPayFaceAuthInfoResult.java  |  2 +-
 .../wxpay/bean/result/WxPayFacepayResult.java |  2 +-
 .../bean/result/WxPayMicropayResult.java      |  2 +-
 .../bean/result/WxPayOrderCloseResult.java    |  2 +-
 .../bean/result/WxPayOrderQueryResult.java    |  2 +-
 .../bean/result/WxPayOrderReverseResult.java  |  2 +-
 .../result/WxPayQueryExchangeRateResult.java  |  2 +-
 .../bean/result/WxPayRedpackQueryResult.java  |  2 +-
 .../bean/result/WxPayRefundQueryResult.java   |  2 +-
 .../wxpay/bean/result/WxPayRefundResult.java  |  2 +-
 .../result/WxPaySandboxSignKeyResult.java     |  2 +-
 .../WxPaySendMiniProgramRedpackResult.java    |  2 +-
 .../bean/result/WxPaySendRedpackResult.java   | 19 ++++++++++---------
 .../bean/result/WxPayShorturlResult.java      |  2 +-
 .../bean/result/WxPayUnifiedOrderResult.java  |  2 +-
 35 files changed, 47 insertions(+), 45 deletions(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
index 4c349206fa..51362a416f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponInfoQueryResult.java
@@ -229,7 +229,7 @@ public class WxPayCouponInfoQueryResult extends BaseWxPayResult {
   private String isPartialUse;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     deviceInfo = readXmlString(d, "device_info");
     couponStockId = readXmlString(d, "coupon_stock_id");
     couponId = readXmlString(d, "coupon_id");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponSendResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponSendResult.java
index e6b40a6fad..c7e970ad91 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponSendResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponSendResult.java
@@ -138,7 +138,7 @@ public class WxPayCouponSendResult extends BaseWxPayResult {
   private String retMsg;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     deviceInfo = readXmlString(d, "device_info");
     couponStockId = readXmlString(d, "coupon_stock_id");
     respCount = readXmlInteger(d, "resp_count");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponStockQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponStockQueryResult.java
index 9de99ffd22..a683a850b8 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponStockQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/coupon/WxPayCouponStockQueryResult.java
@@ -193,7 +193,7 @@ public class WxPayCouponStockQueryResult extends BaseWxPayResult {
   private Integer couponBudget;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     deviceInfo = readXmlString(d, "device_info");
     couponStockId = readXmlString(d, "coupon_stock_id");
     couponName = readXmlString(d, "coupon_name");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankQueryResult.java
index 98438334fa..b7666a545b 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankQueryResult.java
@@ -95,7 +95,7 @@ public class EntPayBankQueryResult extends BaseWxPayResult {
   private String failReason;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     partnerTradeNo = readXmlString(d, "partner_trade_no");
     paymentNo = readXmlString(d, "payment_no");
     bankNoMd5 = readXmlString(d, "bank_no_md5");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankResult.java
index fae51d0aad..44fc6fa7cb 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankResult.java
@@ -50,7 +50,7 @@ public class EntPayBankResult extends BaseWxPayResult {
   private Integer cmmsAmount;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     amount = readXmlInteger(d, "amount");
     partnerTradeNo = readXmlString(d, "partner_trade_no");
     paymentNo = readXmlString(d, "payment_no");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryResult.java
index bf4efac5df..5fe7e05bae 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayQueryResult.java
@@ -83,7 +83,7 @@ public class EntPayQueryResult extends BaseWxPayResult {
   private String desc;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     partnerTradeNo = readXmlString(d, "partner_trade_no");
     detailId = readXmlString(d, "detail_id");
     status = readXmlString(d, "status");
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 9488c32aa8..6e970e3fe8 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
@@ -132,7 +132,7 @@ public class EntPayRedpackQueryResult extends BaseWxPayResult {
   private Integer senderHeaderMediaId;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     mchBillNo = readXmlString(d, "mch_billno");
     detailId = readXmlString(d, "detailId");
     status = readXmlString(d, "status");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java
index a2bf3df7e0..8086ef9604 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackResult.java
@@ -80,7 +80,7 @@ public class EntPayRedpackResult extends BaseWxPayResult implements Serializable
   private String senderHeaderMediaId;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     mchBillNo = readXmlString(d, "mch_billno");
     mchId = readXmlString(d, "mch_id");
     wxAppId = readXmlString(d, "wxappid");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayResult.java
index 7691e4d4a9..7c09caea2c 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayResult.java
@@ -60,7 +60,7 @@ public class EntPayResult extends BaseWxPayResult {
   private String paymentTime;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     mchId = readXmlString(d, "mchid");
     mchAppid = readXmlString(d, "mch_appid");
     deviceInfo = readXmlString(d, "device_info");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/GetPublicKeyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/GetPublicKeyResult.java
index 7e793bbf0a..7a1f518406 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/GetPublicKeyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/GetPublicKeyResult.java
@@ -31,7 +31,7 @@ public class GetPublicKeyResult extends BaseWxPayResult {
   private String pubKey;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     mchId = readXmlString(d, "mch_id");
     pubKey = readXmlString(d, "pub_key");
   }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResult.java
index 976bf12bb1..03e4b359be 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayOrderNotifyResult.java
@@ -352,7 +352,7 @@ public Map toMap() {
   }
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     promotionDetail = readXmlString(d, "promotion_detail");
     deviceInfo = readXmlString(d, "device_info");
     openid = readXmlString(d, "openid");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java
index 6c650d1434..ae86b8c854 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java
@@ -85,7 +85,7 @@ public static WxPayRefundNotifyResult fromXML(String xmlString, String mchKey) t
   private transient String decryptedReqInfo;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     reqInfoString = readXmlString(d, "req_info");
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxScanPayNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxScanPayNotifyResult.java
index d144a4b552..f2081f9a2b 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxScanPayNotifyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxScanPayNotifyResult.java
@@ -47,7 +47,7 @@ public class WxScanPayNotifyResult extends BaseWxPayResult {
   private String productId;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     openid = readXmlString(d, "openid");
     isSubscribe = readXmlString(d, "is_subscribe");
     productId = readXmlString(d, "product_id");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java
index 5657d6ae89..9d0d78e597 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java
@@ -79,7 +79,7 @@ public List formatReceivers() {
   }
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     transactionId = readXmlString(d, "transaction_id");
     outOrderNo = readXmlString(d, "out_order_no");
     orderId = readXmlString(d, "order_id");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java
index 1a048df363..278c2d7d01 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java
@@ -24,7 +24,7 @@ public class ProfitSharingReceiverResult extends BaseWxPayResult {
   private String receiver;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     receiver = readXmlString(d, "receiver");
   }
 }
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 0ca430ab3c..3128450228 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
@@ -33,7 +33,7 @@ public class ProfitSharingResult extends BaseWxPayResult {
   private String orderId;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     transactionId = readXmlString(d, "transaction_id");
     outOrderNo = readXmlString(d, "out_order_no");
     orderId = readXmlString(d, "order_id");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java
index d0531b61e9..bfa7353296 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java
@@ -74,7 +74,7 @@ public class ProfitSharingReturnResult extends BaseWxPayResult {
   private String finishTime;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     orderId = readXmlString(d, "order_id");
     outOrderNo = readXmlString(d, "out_order_no");
     outReturnNo = readXmlString(d, "out_return_no");
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 bbba01bff4..1f6eba15c2 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
@@ -44,7 +44,7 @@
 @Data
 public abstract class BaseWxPayResult implements Serializable {
   private static final long serialVersionUID = -3559552761816864481L;
-  
+
   /**
    * 返回状态码.
    */
@@ -141,7 +141,7 @@ public static  T fromXML(String xmlString, Class c
         t.setXmlString(xmlString);
         Document doc = t.getXmlDoc();
         t.loadBasicXML(doc);
-        t.loadXML(doc);
+        t.loadXml(doc);
         return (T) t;
       } catch (Exception e) {
         throw new RuntimeException("parse xml error", e);
@@ -159,7 +159,7 @@ public static  T fromXML(String xmlString, Class c
    *
    * @param d Document
    */
-  protected abstract void loadXML(Document d);
+  protected abstract void loadXml(Document d);
 
   /**
    * 从XML文档中加载基础属性
@@ -223,6 +223,7 @@ protected static Integer readXmlInteger(Document d, String tagName) {
     if (content == null || content.trim().length() == 0) {
       return null;
     }
+
     return Integer.parseInt(content);
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
index 5bcc77d406..03e35b1c9b 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
@@ -37,7 +37,7 @@ public class WxPayAuthcode2OpenidResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     openid = readXmlString(d, "openid");
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayCommonResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayCommonResult.java
index 1dda6483b4..614bdc2a32 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayCommonResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayCommonResult.java
@@ -14,6 +14,6 @@
 @XStreamAlias("xml")
 public class WxPayCommonResult extends BaseWxPayResult {
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java
index 3a8ab40eae..7cdd210d39 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java
@@ -41,7 +41,7 @@ public class WxPayFaceAuthInfoResult extends BaseWxPayResult implements Serializ
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     authinfo = readXmlString(d, "authinfo");
     expiresIn = readXmlString(d, "expires_in");
   }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
index 989ba7f0c5..1b100ac4f3 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
@@ -249,7 +249,7 @@ public class WxPayFacepayResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     deviceInfo = readXmlString(d, "device_info");
     openid = readXmlString(d, "openid");
     isSubscribe = readXmlString(d, "is_subscribe");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
index 6a2a0630fc..678916d888 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
@@ -222,7 +222,7 @@ public class WxPayMicropayResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     openid = readXmlString(d, "openid");
     isSubscribe = readXmlString(d, "is_subscribe");
     tradeType = readXmlString(d, "trade_type");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
index 0810816c13..a98fec86ab 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
@@ -32,7 +32,7 @@ public class WxPayOrderCloseResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     resultMsg = readXmlString(d, "result_msg");
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
index 2bc97ff080..d21e1375d6 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
@@ -341,7 +341,7 @@ public void composeCoupons() {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     promotionDetail = readXmlString(d, "promotion_detail");
     deviceInfo = readXmlString(d, "device_info");
     openid = readXmlString(d, "openid");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
index 77ad086be0..0f9abd3a7f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
@@ -39,7 +39,7 @@ public class WxPayOrderReverseResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     isRecall = readXmlString(d, "recall");
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java
index d44d282e0f..957547e1b4 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java
@@ -52,7 +52,7 @@ public class WxPayQueryExchangeRateResult extends BaseWxPayResult {
   private String rate;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
 
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
index 0f4e5a91ff..90f9a70e42 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
@@ -233,7 +233,7 @@ public class WxPayRedpackQueryResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     mchBillNo = readXmlString(d, "mch_billno");
     detailId = readXmlString(d, "detail_id");
     status = readXmlString(d, "status");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
index 9a60368f17..54fc8d4e1b 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
@@ -179,7 +179,7 @@ public void composeRefundRecords() {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     deviceInfo = readXmlString(d, "device_info");
     transactionId = readXmlString(d, "transaction_id");
     outTradeNo = readXmlString(d, "out_trade_no");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
index cdb9fc70e0..fa971ffe14 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
@@ -147,7 +147,7 @@ public void composeRefundCoupons() {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     transactionId = readXmlString(d, "transaction_id");
     outTradeNo = readXmlString(d, "out_trade_no");
     outRefundNo = readXmlString(d, "out_refund_no");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
index dfa604ddfd..afc8a94e09 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
@@ -38,7 +38,7 @@ public class WxPaySandboxSignKeyResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     sandboxSignKey = readXmlString(d, "sandbox_signkey");
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
index c58e1c02a4..a3ac787cf9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
@@ -55,7 +55,7 @@ public class WxPaySendMiniProgramRedpackResult extends BaseWxPayResult implement
   private String sendListId;
 
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     mchBillNo = readXmlString(d, "mch_billno");
     wxAppid = readXmlString(d, "wxappid");
     reOpenid = readXmlString(d, "re_openid");
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
index f6293c07c6..2002fd5b1e 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResult.java
@@ -22,24 +22,25 @@
 @XStreamAlias("xml")
 public class WxPaySendRedpackResult extends BaseWxPayResult implements Serializable {
   private static final long serialVersionUID = -4837415036337132073L;
+  private static final String PROCESSING = "PROCESSING";
 
   @XStreamAlias("mch_billno")
-  private String mchBillno;
+  private String mchBillNo;
 
   @XStreamAlias("wxappid")
-  private String wxappid;
+  private String wxAppId;
 
   @XStreamAlias("re_openid")
   private String reOpenid;
 
   @XStreamAlias("total_amount")
-  private int totalAmount;
+  private Integer totalAmount;
 
   @XStreamAlias("send_time")
   private String sendTime;
 
   @XStreamAlias("send_listid")
-  private String sendListid;
+  private String sendListId;
 
   /**
    * 从XML结构中加载额外的熟悉
@@ -47,13 +48,13 @@ public class WxPaySendRedpackResult extends BaseWxPayResult implements Serializa
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
-    mchBillno = readXmlString(d, "mch_billno");
-    wxappid = readXmlString(d, "wxappid");
+  protected void loadXml(Document d) {
+    mchBillNo = readXmlString(d, "mch_billno");
+    wxAppId = readXmlString(d, "wxappid");
     reOpenid = readXmlString(d, "re_openid");
     totalAmount = readXmlInteger(d, "total_amount");
     sendTime = readXmlString(d, "send_time");
-    sendListid = readXmlString(d, "send_listid");
+    sendListId = readXmlString(d, "send_listid");
   }
 
   @Override
@@ -61,7 +62,7 @@ public void checkResult(WxPayService wxPayService, String signType, boolean chec
     try {
       super.checkResult(wxPayService, signType, checkSuccess);
     } catch (WxPayException e) {
-      if (!"PROCESSING".equals(e.getErrCode())) {
+      if (!PROCESSING.equals(e.getErrCode())) {
         throw e;
       }
     }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
index 55463d6556..6b692ec080 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
@@ -38,7 +38,7 @@ public class WxPayShorturlResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     shortUrl = readXmlString(d, "short_url");
   }
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
index 19e8be1cb1..60d7e7f013 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
@@ -50,7 +50,7 @@ public class WxPayUnifiedOrderResult extends BaseWxPayResult {
    * @param d Document
    */
   @Override
-  protected void loadXML(Document d) {
+  protected void loadXml(Document d) {
     prepayId = readXmlString(d, "prepay_id");
     tradeType = readXmlString(d, "trade_type");
     mwebUrl = readXmlString(d, "mweb_url");

From 17aaba249645ab64c77f2deb0d7937a7d6bed447 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 30 May 2020 21:59:32 +0800
Subject: [PATCH 10/90] =?UTF-8?q?:art:=20=E5=BE=AE=E4=BF=A1=E6=A8=A1?=
 =?UTF-8?q?=E7=89=88=E6=B6=88=E6=81=AF=E8=A1=8C=E4=B8=9A=E8=8E=B7=E5=8F=96?=
 =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/mp/bean/template/WxMpTemplateIndustryEnum.java  | 7 ++++---
 .../weixin/mp/util/json/WxMpIndustryGsonAdapter.java       | 5 +++--
 2 files changed, 7 insertions(+), 5 deletions(-)

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 022551d64e..6620d86aa4 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
@@ -193,12 +193,13 @@ public enum WxMpTemplateIndustryEnum {
   /**
    * 查找行业
    *
-   * @param industry 二级行业名称
+   * @param firstClass  主行业名称
+   * @param secondClass 副行业名称
    * @return .
    */
-  public static WxMpTemplateIndustryEnum findBySecondary(String industry) {
+  public static WxMpTemplateIndustryEnum findByClass(String firstClass, String secondClass) {
     for (WxMpTemplateIndustryEnum industryEnum : WxMpTemplateIndustryEnum.values()) {
-      if (industryEnum.secondClass.contains(industry)) {
+      if (industryEnum.firstClass.equals(firstClass) && industryEnum.secondClass.contains(secondClass)) {
         return industryEnum;
       }
     }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
index 9c418c2a68..30ac9c1a74 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
@@ -28,8 +28,9 @@ public WxMpTemplateIndustry deserialize(JsonElement jsonElement, Type type, Json
   }
 
   private WxMpTemplateIndustryEnum convertFromJson(JsonObject json) {
+    String firstClass = GsonHelper.getString(json, "first_class");
     String secondClass = GsonHelper.getString(json, "second_class");
-    final WxMpTemplateIndustryEnum industryEnum = WxMpTemplateIndustryEnum.findBySecondary(secondClass);
+    final WxMpTemplateIndustryEnum industryEnum = WxMpTemplateIndustryEnum.findByClass(firstClass, secondClass);
     if (industryEnum != null) {
       return industryEnum;
     }
@@ -38,7 +39,7 @@ private WxMpTemplateIndustryEnum convertFromJson(JsonObject json) {
       secondClass = secondClass.split("\\|")[1];
     }
 
-    return WxMpTemplateIndustryEnum.findBySecondary(secondClass);
+    return WxMpTemplateIndustryEnum.findByClass(firstClass, secondClass);
   }
 
 }

From 0a2e4d8aea9515dca174ec553a9927e1b0479ca3 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 30 May 2020 23:14:56 +0800
Subject: [PATCH 11/90] =?UTF-8?q?:bookmark:=20=20=E5=8F=91=E5=B8=83=203.8.?=
 =?UTF-8?q?1.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 +-
 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 +-
 13 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/pom.xml b/pom.xml
index b24ce0b77f..01b8a5e57e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
   4.0.0
   com.github.binarywang
   wx-java
-  3.8.0
+  3.8.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 264c91d69d..6682837f94 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.0
+    3.8.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 dc63257c79..bccd7d9c70 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.0
+    3.8.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 e8d0e14832..6a2aa2a06a 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.0
+    3.8.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 265cef1efd..676aaea58e 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.0
+    3.8.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 f49b20bb99..92401b9430 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.0
+    3.8.1.1.B
   
   4.0.0
 
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 104e4ffb45..a77c4966f7 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.0
+    3.8.1.1.B
   
 
   weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 4d05d5c3f7..2ed0bf5499 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.0
+    3.8.1.1.B
   
 
   weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index cbd9be4d40..4bbe2f9472 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.0
+    3.8.1.1.B
   
 
   weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 8efd3e5403..fc65d4d0cd 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.0
+    3.8.1.1.B
   
 
   weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index a113e0bf87..d36f392af8 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.0
+    3.8.1.1.B
   
 
   weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index b03d8b3307..109f017c71 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.0
+    3.8.1.1.B
   
 
   weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index ba61c03740..db9dce02e6 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.0
+    3.8.1.1.B
   
   4.0.0
 

From 2446fa626b45733681bbc446dd52b098345b50ec Mon Sep 17 00:00:00 2001
From: Mario Luo 
Date: Sun, 31 May 2020 22:51:10 +0800
Subject: [PATCH 12/90] =?UTF-8?q?:art:=20#1592=20=E5=AE=9E=E7=8E=B0?=
 =?UTF-8?q?=E7=AE=80=E5=8D=95=E7=9A=84redis=E5=88=86=E5=B8=83=E5=BC=8F?=
 =?UTF-8?q?=E9=94=81=20RedisTemplateSimpleDistributedLock?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/redis/RedisTemplateWxRedisOps.java |   7 +-
 .../RedisTemplateSimpleDistributedLock.java   | 126 ++++++++++++++++++
 ...edisTemplateSimpleDistributedLockTest.java |  79 +++++++++++
 .../result/WxPaySendRedpackResultTest.java    |   8 +-
 4 files changed, 213 insertions(+), 7 deletions(-)
 create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/locks/RedisTemplateSimpleDistributedLock.java
 create mode 100644 weixin-java-common/src/test/java/me/chanjar/weixin/common/util/locks/RedisTemplateSimpleDistributedLockTest.java

diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/RedisTemplateWxRedisOps.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/RedisTemplateWxRedisOps.java
index 652cec84a1..19d4046c92 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/RedisTemplateWxRedisOps.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/RedisTemplateWxRedisOps.java
@@ -1,11 +1,12 @@
 package me.chanjar.weixin.common.redis;
 
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.common.util.locks.RedisTemplateSimpleDistributedLock;
 import org.springframework.data.redis.core.StringRedisTemplate;
 
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
 
 @RequiredArgsConstructor
 public class RedisTemplateWxRedisOps implements WxRedisOps {
@@ -37,7 +38,7 @@ public void expire(String key, int expire, TimeUnit timeUnit) {
   }
 
   @Override
-  public Lock getLock(String key) {
-    return new ReentrantLock();
+  public Lock getLock(@NonNull String key) {
+    return new RedisTemplateSimpleDistributedLock(redisTemplate, key, 60 * 1000);
   }
 }
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/locks/RedisTemplateSimpleDistributedLock.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/locks/RedisTemplateSimpleDistributedLock.java
new file mode 100644
index 0000000000..dfac1c28fb
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/locks/RedisTemplateSimpleDistributedLock.java
@@ -0,0 +1,126 @@
+package me.chanjar.weixin.common.util.locks;
+
+import lombok.Getter;
+import lombok.NonNull;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.dao.DataAccessException;
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.connection.RedisStringCommands;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.script.DefaultRedisScript;
+import org.springframework.data.redis.core.script.RedisScript;
+import org.springframework.data.redis.core.types.Expiration;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+
+/**
+ * 实现简单的redis分布式锁, 支持重入, 不是红锁
+ *
+ * @see reids distlock
+ */
+public class RedisTemplateSimpleDistributedLock implements Lock {
+
+  @Getter
+  private final StringRedisTemplate redisTemplate;
+  @Getter
+  private final String key;
+  @Getter
+  private final int leaseMilliseconds;
+
+  private final ThreadLocal valueThreadLocal = new ThreadLocal<>();
+
+  public RedisTemplateSimpleDistributedLock(@NonNull StringRedisTemplate redisTemplate, int leaseMilliseconds) {
+    this(redisTemplate, "lock:" + UUID.randomUUID().toString(), leaseMilliseconds);
+  }
+
+  public RedisTemplateSimpleDistributedLock(@NonNull StringRedisTemplate redisTemplate, @NonNull String key, int leaseMilliseconds) {
+    if (leaseMilliseconds <= 0) {
+      throw new IllegalArgumentException("Parameter 'leaseMilliseconds' must grate then 0: " + leaseMilliseconds);
+    }
+    this.redisTemplate = redisTemplate;
+    this.key = key;
+    this.leaseMilliseconds = leaseMilliseconds;
+  }
+
+  @Override
+  public void lock() {
+    while (!tryLock()) {
+      try {
+        Thread.sleep(1000);
+      } catch (InterruptedException e) {
+        // Ignore
+      }
+    }
+  }
+
+  @Override
+  public void lockInterruptibly() throws InterruptedException {
+    while (!tryLock()) {
+      Thread.sleep(1000);
+    }
+  }
+
+  @Override
+  public boolean tryLock() {
+    String value = valueThreadLocal.get();
+    if (value == null || value.length() == 0) {
+      value = UUID.randomUUID().toString();
+      valueThreadLocal.set(value);
+    }
+    final byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
+    final byte[] valueBytes = value.getBytes(StandardCharsets.UTF_8);
+    List redisResults = redisTemplate.executePipelined(new RedisCallback() {
+      @Override
+      public String doInRedis(RedisConnection connection) throws DataAccessException {
+        connection.set(keyBytes, valueBytes, Expiration.milliseconds(leaseMilliseconds), RedisStringCommands.SetOption.SET_IF_ABSENT);
+        connection.get(keyBytes);
+        return null;
+      }
+    });
+    Object currentLockSecret = redisResults.size() > 1 ? redisResults.get(1) : redisResults.get(0);
+    return currentLockSecret != null && currentLockSecret.toString().equals(value);
+  }
+
+  @Override
+  public boolean tryLock(long time, @NotNull TimeUnit unit) throws InterruptedException {
+    long waitMs = unit.toMillis(time);
+    boolean locked = tryLock();
+    while (!locked && waitMs > 0) {
+      long sleep = waitMs < 1000 ? waitMs : 1000;
+      Thread.sleep(sleep);
+      waitMs -= sleep;
+      locked = tryLock();
+    }
+    return locked;
+  }
+
+  @Override
+  public void unlock() {
+    if (valueThreadLocal.get() != null) {
+      // 提示: 必须指定returnType, 类型: 此处必须为Long, 不能是Integer
+      RedisScript script = new DefaultRedisScript("if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end", Long.class);
+      redisTemplate.execute(script, Arrays.asList(key), valueThreadLocal.get());
+      valueThreadLocal.remove();
+    }
+  }
+
+  @Override
+  public Condition newCondition() {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * 获取当前锁的值
+   * return 返回null意味着没有加锁, 但是返回非null值并不以为着当前加锁成功(redis中key可能自动过期)
+   */
+  public String getLockSecretValue() {
+    return valueThreadLocal.get();
+  }
+}
diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/locks/RedisTemplateSimpleDistributedLockTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/locks/RedisTemplateSimpleDistributedLockTest.java
new file mode 100644
index 0000000000..50a17ed94b
--- /dev/null
+++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/locks/RedisTemplateSimpleDistributedLockTest.java
@@ -0,0 +1,79 @@
+package me.chanjar.weixin.common.util.locks;
+
+import lombok.SneakyThrows;
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.testng.Assert.*;
+
+@Test(enabled = false)
+public class RedisTemplateSimpleDistributedLockTest {
+
+  RedisTemplateSimpleDistributedLock redisLock;
+
+  StringRedisTemplate redisTemplate;
+
+  AtomicInteger lockCurrentExecuteCounter;
+
+  @BeforeTest
+  public void init() {
+    JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
+    connectionFactory.setHostName("127.0.0.1");
+    connectionFactory.setPort(6379);
+    connectionFactory.afterPropertiesSet();
+    StringRedisTemplate redisTemplate = new StringRedisTemplate(connectionFactory);
+    this.redisTemplate = redisTemplate;
+    this.redisLock = new RedisTemplateSimpleDistributedLock(redisTemplate, 60000);
+    this.lockCurrentExecuteCounter = new AtomicInteger(0);
+  }
+
+  @Test(description = "多线程测试锁排他性")
+  public void testLockExclusive() throws InterruptedException {
+    int threadSize = 100;
+    final CountDownLatch startLatch = new CountDownLatch(threadSize);
+    final CountDownLatch endLatch = new CountDownLatch(threadSize);
+
+    for (int i = 0; i < threadSize; i++) {
+      new Thread(new Runnable() {
+        @SneakyThrows
+        @Override
+        public void run() {
+          startLatch.await();
+
+          redisLock.lock();
+          assertEquals(lockCurrentExecuteCounter.incrementAndGet(), 1, "临界区同时只能有一个线程执行");
+          lockCurrentExecuteCounter.decrementAndGet();
+          redisLock.unlock();
+
+          endLatch.countDown();
+        }
+      }).start();
+      startLatch.countDown();
+    }
+    endLatch.await();
+  }
+
+  @Test
+  public void testTryLock() throws InterruptedException {
+    assertTrue(redisLock.tryLock(3, TimeUnit.SECONDS), "第一次加锁应该成功");
+    assertNotNull(redisLock.getLockSecretValue());
+    String redisValue = this.redisTemplate.opsForValue().get(redisLock.getKey());
+    assertEquals(redisValue, redisLock.getLockSecretValue());
+
+    redisLock.unlock();
+    assertNull(redisLock.getLockSecretValue());
+    redisValue = this.redisTemplate.opsForValue().get(redisLock.getKey());
+    assertNull(redisValue, "释放锁后key会被删除");
+
+    redisLock.unlock();
+  }
+
+
+}
+
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResultTest.java
index 206703b850..cb9007828f 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResultTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResultTest.java
@@ -1,10 +1,10 @@
 package com.github.binarywang.wxpay.bean.result;
 
-import org.testng.*;
-import org.testng.annotations.*;
-
 import com.thoughtworks.xstream.XStream;
 import me.chanjar.weixin.common.util.xml.XStreamInitializer;
+import org.testng.Assert;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
 
 /**
  * The type Wx pay send redpack result test.
@@ -68,6 +68,6 @@ public void loadFailureResult() {
     Assert.assertEquals("FAIL", wxMpRedpackResult.getReturnCode());
     Assert.assertEquals("FAIL", wxMpRedpackResult.getResultCode());
     Assert.assertEquals("onqOjjmM1tad-3ROpncN-yUfa6uI", wxMpRedpackResult.getReOpenid());
-    Assert.assertEquals(1, wxMpRedpackResult.getTotalAmount());
+    Assert.assertEquals(Integer.valueOf(1), wxMpRedpackResult.getTotalAmount());
   }
 }

From 6c3d090ebd014b01c0a2fe95f51631fdcdd2b994 Mon Sep 17 00:00:00 2001
From: Mario Luo 
Date: Sun, 31 May 2020 22:54:11 +0800
Subject: [PATCH 13/90] :bug: #1582 use lock.tryLock() to avoid waiting for
 locks for a long time

---
 .../api/impl/WxMpServiceHttpClientImpl.java   | 22 ++++++++++------
 .../mp/api/impl/WxMpServiceJoddHttpImpl.java  | 25 ++++++++++++-------
 .../mp/api/impl/WxMpServiceOkHttpImpl.java    | 21 ++++++++++------
 .../api/impl/WxOpenComponentServiceImpl.java  | 19 ++++++++++----
 4 files changed, 57 insertions(+), 30 deletions(-)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java
index 8c0849b76e..6e7ee376c7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java
@@ -1,8 +1,5 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import me.chanjar.weixin.common.WxType;
-import me.chanjar.weixin.common.bean.WxAccessToken;
-import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.HttpType;
 import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
@@ -16,6 +13,7 @@
 import org.apache.http.impl.client.CloseableHttpClient;
 
 import java.io.IOException;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_ACCESS_TOKEN_URL;
@@ -72,11 +70,15 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException {
     }
 
     Lock lock = config.getAccessTokenLock();
-    lock.lock();
+    boolean locked = false;
     try {
-      if (!config.isAccessTokenExpired() && !forceRefresh) {
-        return config.getAccessToken();
-      }
+      do {
+        locked = lock.tryLock(100, TimeUnit.MILLISECONDS);
+        if (!forceRefresh && !config.isAccessTokenExpired()) {
+          return config.getAccessToken();
+        }
+      } while (!locked);
+
       String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret());
       try {
         HttpGet httpGet = new HttpGet(url);
@@ -92,8 +94,12 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException {
       } catch (IOException e) {
         throw new RuntimeException(e);
       }
+    } catch (InterruptedException e) {
+      throw new RuntimeException(e);
     } finally {
-      lock.unlock();
+      if (locked) {
+        lock.unlock();
+      }
     }
   }
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceJoddHttpImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceJoddHttpImpl.java
index 595a257f9e..56b8eb12eb 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceJoddHttpImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceJoddHttpImpl.java
@@ -1,14 +1,14 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import jodd.http.*;
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.ProxyInfo;
 import jodd.http.net.SocketHttpConnectionProvider;
-import me.chanjar.weixin.common.WxType;
-import me.chanjar.weixin.common.bean.WxAccessToken;
-import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.HttpType;
 import me.chanjar.weixin.mp.config.WxMpConfigStorage;
 
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_ACCESS_TOKEN_URL;
@@ -57,11 +57,14 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException {
     }
 
     Lock lock = config.getAccessTokenLock();
-    lock.lock();
+    boolean locked = false;
     try {
-      if (!config.isAccessTokenExpired() && !forceRefresh) {
-        return config.getAccessToken();
-      }
+      do {
+        locked = lock.tryLock(100, TimeUnit.MILLISECONDS);
+        if (!forceRefresh && !config.isAccessTokenExpired()) {
+          return config.getAccessToken();
+        }
+      } while (!locked);
       String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret());
 
       HttpRequest request = HttpRequest.get(url);
@@ -73,8 +76,12 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException {
       }
 
       return this.extractAccessToken(request.send().bodyText());
+    } catch (InterruptedException e) {
+      throw new RuntimeException(e);
     } finally {
-      lock.unlock();
+      if (locked) {
+        lock.unlock();
+      }
     }
   }
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceOkHttpImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceOkHttpImpl.java
index 1c5c92bc96..6d6708349f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceOkHttpImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceOkHttpImpl.java
@@ -1,8 +1,5 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import me.chanjar.weixin.common.WxType;
-import me.chanjar.weixin.common.bean.WxAccessToken;
-import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.HttpType;
 import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
@@ -11,6 +8,7 @@
 
 import java.io.IOException;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_ACCESS_TOKEN_URL;
@@ -47,11 +45,14 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException {
     }
 
     Lock lock = config.getAccessTokenLock();
-    lock.lock();
+    boolean locked = false;
     try {
-      if (!config.isAccessTokenExpired() && !forceRefresh) {
-        return config.getAccessToken();
-      }
+      do {
+        locked = lock.tryLock(100, TimeUnit.MILLISECONDS);
+        if (!forceRefresh && !config.isAccessTokenExpired()) {
+          return config.getAccessToken();
+        }
+      } while (!locked);
       String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret());
 
       Request request = new Request.Builder().url(url).get().build();
@@ -59,8 +60,12 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException {
       return this.extractAccessToken(Objects.requireNonNull(response.body()).string());
     } catch (IOException e) {
       throw new RuntimeException(e);
+    } catch (InterruptedException e) {
+      throw new RuntimeException(e);
     } finally {
-      lock.unlock();
+      if (locked) {
+        lock.unlock();
+      }
     }
   }
 
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 4483e0a0c8..82032eaf63 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
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 
 /**
@@ -383,11 +384,15 @@ public String getAuthorizerAccessToken(String appId, boolean forceRefresh) throw
       return config.getAuthorizerAccessToken(appId);
     }
     Lock lock = config.getWxMpConfigStorage(appId).getAccessTokenLock();
-    lock.lock();
+    boolean locked = false;
     try {
-      if (!config.isAuthorizerAccessTokenExpired(appId) && !forceRefresh) {
-        return config.getAuthorizerAccessToken(appId);
-      }
+      do {
+        locked = lock.tryLock(100, TimeUnit.MILLISECONDS);
+        if (!forceRefresh && !config.isAuthorizerAccessTokenExpired(appId)) {
+          return config.getAuthorizerAccessToken(appId);
+        }
+      } while (!locked);
+
       JsonObject jsonObject = new JsonObject();
       jsonObject.addProperty("component_appid", getWxOpenConfigStorage().getComponentAppId());
       jsonObject.addProperty("authorizer_appid", appId);
@@ -397,8 +402,12 @@ public String getAuthorizerAccessToken(String appId, boolean forceRefresh) throw
       WxOpenAuthorizerAccessToken wxOpenAuthorizerAccessToken = WxOpenAuthorizerAccessToken.fromJson(responseContent);
       config.updateAuthorizerAccessToken(appId, wxOpenAuthorizerAccessToken);
       return config.getAuthorizerAccessToken(appId);
+    } catch (InterruptedException e) {
+      throw new RuntimeException(e);
     } finally {
-      lock.unlock();
+      if (locked) {
+        lock.unlock();
+      }
     }
   }
 

From 1c60839890ac6e4cb0ccfb8865a37905623e6d40 Mon Sep 17 00:00:00 2001
From: Mario Luo 
Date: Mon, 1 Jun 2020 22:35:59 +0800
Subject: [PATCH 14/90] =?UTF-8?q?:art:=20#571=20=20=E5=BE=AE=E4=BF=A1?=
 =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82?=
 =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E7=A7=8Dhttp=E5=AE=A2=E6=88=B7?=
 =?UTF-8?q?=E7=AB=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../README.md                                 |   2 +-
 .../miniapp/config/WxMaAutoConfiguration.java |  21 +-
 .../wxjava/miniapp/enums/HttpClientType.java  |  10 +-
 .../miniapp/api/impl/BaseWxMaServiceImpl.java | 397 +++++++++++++++++
 .../api/impl/WxMaServiceHttpClientImpl.java   |  88 ++++
 .../wx/miniapp/api/impl/WxMaServiceImpl.java  | 419 +-----------------
 .../api/impl/WxMaServiceJoddHttpImpl.java     |  59 +++
 .../api/impl/WxMaServiceOkHttpImpl.java       |  72 +++
 .../open/api/impl/WxOpenMaServiceImpl.java    |  11 +-
 9 files changed, 653 insertions(+), 426 deletions(-)
 create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
 create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceHttpClientImpl.java
 create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceJoddHttpImpl.java
 create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceOkHttpImpl.java

diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md
index 3d4fae2416..82f6bdd8b1 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md
@@ -23,7 +23,7 @@
     wx.miniapp.config-storage.redis.host = 127.0.0.1
     wx.miniapp.config-storage.redis.port = 6379
     # http客户端配置
-    wx.miniapp.config-storage.http-client-type=HttpClient      # http客户端类型: HttpClient(默认)
+    wx.miniapp.config-storage.http-client-type=HttpClient      # http客户端类型: HttpClient(默认), OkHttp, JoddHttp
     wx.miniapp.config-storage.http-proxy-host=
     wx.miniapp.config-storage.http-proxy-port=
     wx.miniapp.config-storage.http-proxy-username=
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java
index ab843ab5bf..0aad25f143 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java
@@ -1,11 +1,14 @@
 package com.binarywang.spring.starter.wxjava.miniapp.config;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceHttpClientImpl;
 import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceJoddHttpImpl;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceOkHttpImpl;
 import cn.binarywang.wx.miniapp.config.WxMaConfig;
 import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
 import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl;
-import com.binarywang.spring.starter.wxjava.miniapp.enums.StorageType;
+import com.binarywang.spring.starter.wxjava.miniapp.enums.HttpClientType;
 import com.binarywang.spring.starter.wxjava.miniapp.properties.ConfigStorage;
 import com.binarywang.spring.starter.wxjava.miniapp.properties.RedisProperties;
 import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties;
@@ -49,9 +52,19 @@ public class WxMaAutoConfiguration {
   @Bean
   @ConditionalOnMissingBean(WxMaService.class)
   public WxMaService service(WxMaConfig wxMaConfig) {
-    final WxMaServiceImpl service = new WxMaServiceImpl();
-    service.setWxMaConfig(wxMaConfig);
-    return service;
+    HttpClientType httpClientType = wxMaProperties.getConfigStorage().getHttpClientType();
+    WxMaService wxMaService;
+    if (httpClientType == HttpClientType.OkHttp) {
+      wxMaService = new WxMaServiceOkHttpImpl();
+    } else if (httpClientType == HttpClientType.JoddHttp) {
+      wxMaService = new WxMaServiceJoddHttpImpl();
+    } else if (httpClientType == HttpClientType.HttpClient) {
+      wxMaService = new WxMaServiceHttpClientImpl();
+    } else {
+      wxMaService = new WxMaServiceImpl();
+    }
+    wxMaService.setWxMaConfig(wxMaConfig);
+    return wxMaService;
   }
 
   @Bean
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/HttpClientType.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/HttpClientType.java
index 18ca00dd77..52a53debdc 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/HttpClientType.java
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/enums/HttpClientType.java
@@ -10,5 +10,13 @@ public enum HttpClientType {
   /**
    * HttpClient.
    */
-  HttpClient
+  HttpClient,
+  /**
+   * OkHttp.
+   */
+  OkHttp,
+  /**
+   * JoddHttp.
+   */
+  JoddHttp,
 }
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
new file mode 100644
index 0000000000..ee891ecb7b
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
@@ -0,0 +1,397 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.*;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableMap;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.bean.WxAccessToken;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.DataUtils;
+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.json.WxGsonBuilder;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ErrorCode.*;
+
+/**
+ * @author Binary Wang
+ * @see #doGetAccessTokenRequest
+ */
+@Slf4j
+public abstract class BaseWxMaServiceImpl implements WxMaService, RequestHttp {
+  private static final JsonParser JSON_PARSER = new JsonParser();
+  private WxMaConfig wxMaConfig;
+
+  private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this);
+  private final WxMaMediaService materialService = new WxMaMediaServiceImpl(this);
+  private final WxMaUserService userService = new WxMaUserServiceImpl(this);
+  private final WxMaQrcodeService qrCodeService = new WxMaQrcodeServiceImpl(this);
+  private final WxMaTemplateService templateService = new WxMaTemplateServiceImpl(this);
+  private final WxMaAnalysisService analysisService = new WxMaAnalysisServiceImpl(this);
+  private final WxMaCodeService codeService = new WxMaCodeServiceImpl(this);
+  private final WxMaSettingService settingService = new WxMaSettingServiceImpl(this);
+  private final WxMaJsapiService jsapiService = new WxMaJsapiServiceImpl(this);
+  private final WxMaShareService shareService = new WxMaShareServiceImpl(this);
+  private final WxMaRunService runService = new WxMaRunServiceImpl(this);
+  private final WxMaSecCheckService secCheckService = new WxMaSecCheckServiceImpl(this);
+  private final WxMaPluginService pluginService = new WxMaPluginServiceImpl(this);
+  private final WxMaExpressService expressService = new WxMaExpressServiceImpl(this);
+  private final WxMaSubscribeService subscribeService = new WxMaSubscribeServiceImpl(this);
+  private final WxMaCloudService cloudService = new WxMaCloudServiceImpl(this);
+  private final WxMaLiveService liveService = new WxMaLiveServiceImpl(this);
+
+  private int retrySleepMillis = 1000;
+  private int maxRetryTimes = 5;
+
+  protected static final Gson GSON = new Gson();
+
+  @Override
+  public RequestHttp getRequestHttp() {
+    return this;
+  }
+
+  @Override
+  public String getPaidUnionId(String openid, String transactionId, String mchId, String outTradeNo)
+    throws WxErrorException {
+    Map params = new HashMap<>(8);
+    params.put("openid", openid);
+
+    if (StringUtils.isNotEmpty(transactionId)) {
+      params.put("transaction_id", transactionId);
+    }
+
+    if (StringUtils.isNotEmpty(mchId)) {
+      params.put("mch_id", mchId);
+    }
+
+    if (StringUtils.isNotEmpty(outTradeNo)) {
+      params.put("out_trade_no", outTradeNo);
+    }
+
+    String responseContent = this.get(GET_PAID_UNION_ID_URL, Joiner.on("&").withKeyValueSeparator("=").join(params));
+    WxError error = WxError.fromJson(responseContent, WxType.MiniApp);
+    if (error.getErrorCode() != 0) {
+      throw new WxErrorException(error);
+    }
+
+    return JSON_PARSER.parse(responseContent).getAsJsonObject().get("unionid").getAsString();
+  }
+
+  @Override
+  public WxMaJscode2SessionResult jsCode2SessionInfo(String jsCode) throws WxErrorException {
+    final WxMaConfig config = getWxMaConfig();
+    Map params = new HashMap<>(8);
+    params.put("appid", config.getAppid());
+    params.put("secret", config.getSecret());
+    params.put("js_code", jsCode);
+    params.put("grant_type", "authorization_code");
+
+    String result = get(JSCODE_TO_SESSION_URL, Joiner.on("&").withKeyValueSeparator("=").join(params));
+    return WxMaJscode2SessionResult.fromJson(result);
+  }
+
+  @Override
+  public void setDynamicData(int lifespan, String type, int scene, String data) throws WxErrorException {
+    JsonObject jsonObject = new JsonObject();
+    jsonObject.addProperty("lifespan", lifespan);
+    jsonObject.addProperty("query", WxGsonBuilder.create().toJson(ImmutableMap.of("type", type)));
+    jsonObject.addProperty("data", data);
+    jsonObject.addProperty("scene", scene);
+
+    this.post(SET_DYNAMIC_DATA_URL, jsonObject.toString());
+  }
+
+  @Override
+  public boolean checkSignature(String timestamp, String nonce, String signature) {
+    try {
+      return SHA1.gen(this.getWxMaConfig().getToken(), timestamp, nonce).equals(signature);
+    } catch (Exception e) {
+      log.error("Checking signature failed, and the reason is :" + e.getMessage());
+      return false;
+    }
+  }
+
+  @Override
+  public String getAccessToken() throws WxErrorException {
+    return getAccessToken(false);
+  }
+
+  @Override
+  public String getAccessToken(boolean forceRefresh) throws WxErrorException {
+    if (!forceRefresh && !this.getWxMaConfig().isAccessTokenExpired()) {
+      return this.getWxMaConfig().getAccessToken();
+    }
+
+    Lock lock = this.getWxMaConfig().getAccessTokenLock();
+    boolean locked = false;
+    try {
+      do {
+        locked = lock.tryLock(100, TimeUnit.MILLISECONDS);
+        if (!forceRefresh && !this.getWxMaConfig().isAccessTokenExpired()) {
+          return this.getWxMaConfig().getAccessToken();
+        }
+      } while (!locked);
+      String response = doGetAccessTokenRequest();
+      return extractAccessToken(response);
+    } catch (IOException | InterruptedException e) {
+      throw new RuntimeException(e);
+    } finally {
+      if (locked) {
+        lock.unlock();
+      }
+    }
+  }
+
+  /**
+   * 通过网络请求获取AccessToken
+   *
+   * @return
+   * @throws IOException
+   */
+  protected abstract String doGetAccessTokenRequest() throws IOException;
+
+  @Override
+  public String get(String url, String queryParam) throws WxErrorException {
+    return execute(SimpleGetRequestExecutor.create(this), url, queryParam);
+  }
+
+  @Override
+  public String post(String url, String postData) throws WxErrorException {
+    return execute(SimplePostRequestExecutor.create(this), url, postData);
+  }
+
+  @Override
+  public String post(String url, Object obj) throws WxErrorException {
+    return this.execute(SimplePostRequestExecutor.create(this), url, WxGsonBuilder.create().toJson(obj));
+  }
+
+  /**
+   * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求
+   */
+  @Override
+  public  T execute(RequestExecutor executor, String uri, E data) throws WxErrorException {
+    int retryTimes = 0;
+    do {
+      try {
+        return this.executeInternal(executor, uri, data);
+      } catch (WxErrorException e) {
+        if (retryTimes + 1 > this.maxRetryTimes) {
+          log.warn("重试达到最大次数【{}】", maxRetryTimes);
+          //最后一次重试失败后,直接抛出异常,不再等待
+          throw new WxErrorException(WxError.builder()
+            .errorCode(e.getError().getErrorCode())
+            .errorMsg("微信服务端异常,超出重试次数!")
+            .build());
+        }
+
+        WxError error = e.getError();
+        // -1 系统繁忙, 1000ms后重试
+        if (error.getErrorCode() == -1) {
+          int sleepMillis = this.retrySleepMillis * (1 << retryTimes);
+          try {
+            log.warn("微信系统繁忙,{} ms 后重试(第{}次)", sleepMillis, retryTimes + 1);
+            Thread.sleep(sleepMillis);
+          } catch (InterruptedException e1) {
+            Thread.currentThread().interrupt();
+          }
+        } else {
+          throw e;
+        }
+      }
+    } while (retryTimes++ < this.maxRetryTimes);
+
+    log.warn("重试达到最大次数【{}】", this.maxRetryTimes);
+    throw new RuntimeException("微信服务端异常,超出重试次数");
+  }
+
+  private  T executeInternal(RequestExecutor executor, String uri, E data) throws WxErrorException {
+    E dataForLog = DataUtils.handleDataWithSecret(data);
+
+    if (uri.contains("access_token=")) {
+      throw new IllegalArgumentException("uri参数中不允许有access_token: " + uri);
+    }
+    String accessToken = getAccessToken(false);
+
+    String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "access_token=" + accessToken;
+
+    try {
+      T result = executor.execute(uriWithAccessToken, data, WxType.MiniApp);
+      log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result);
+      return result;
+    } catch (WxErrorException e) {
+      WxError error = e.getError();
+      /*
+       * 发生以下情况时尝试刷新access_token
+       */
+      if (error.getErrorCode() == ERR_40001
+        || error.getErrorCode() == ERR_42001
+        || error.getErrorCode() == ERR_40014) {
+        // 强制设置WxMaConfig的access token过期了,这样在下一次请求里就会刷新access token
+        Lock lock = this.getWxMaConfig().getAccessTokenLock();
+        lock.lock();
+        try {
+          if (StringUtils.equals(this.getWxMaConfig().getAccessToken(), accessToken)) {
+            this.getWxMaConfig().expireAccessToken();
+          }
+        } catch (Exception ex) {
+          this.getWxMaConfig().expireAccessToken();
+        } finally {
+          lock.unlock();
+        }
+        if (this.getWxMaConfig().autoRefreshToken()) {
+          return this.execute(executor, uri, data);
+        }
+      }
+
+      if (error.getErrorCode() != 0) {
+        log.error("\n【请求地址】: {}\n【请求参数】:{}\n【错误信息】:{}", uriWithAccessToken, dataForLog, error);
+        throw new WxErrorException(error, e);
+      }
+      return null;
+    } catch (IOException e) {
+      log.error("\n【请求地址】: {}\n【请求参数】:{}\n【异常信息】:{}", uriWithAccessToken, dataForLog, e.getMessage());
+      throw new RuntimeException(e);
+    }
+  }
+
+  /**
+   * 设置当前的AccessToken
+   *
+   * @param resultContent
+   * @return
+   * @throws WxErrorException
+   */
+  protected String extractAccessToken(String resultContent) throws WxErrorException {
+    WxMaConfig config = this.getWxMaConfig();
+    WxError error = WxError.fromJson(resultContent, WxType.MiniApp);
+    if (error.getErrorCode() != 0) {
+      throw new WxErrorException(error);
+    }
+    WxAccessToken accessToken = WxAccessToken.fromJson(resultContent);
+    config.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
+    return accessToken.getAccessToken();
+  }
+
+  @Override
+  public WxMaConfig getWxMaConfig() {
+    return this.wxMaConfig;
+  }
+
+  @Override
+  public void setWxMaConfig(WxMaConfig wxConfigProvider) {
+    this.wxMaConfig = wxConfigProvider;
+    this.initHttp();
+  }
+
+  @Override
+  public void setRetrySleepMillis(int retrySleepMillis) {
+    this.retrySleepMillis = retrySleepMillis;
+  }
+
+  @Override
+  public void setMaxRetryTimes(int maxRetryTimes) {
+    this.maxRetryTimes = maxRetryTimes;
+  }
+
+  @Override
+  public WxMaMsgService getMsgService() {
+    return this.kefuService;
+  }
+
+  @Override
+  public WxMaMediaService getMediaService() {
+    return this.materialService;
+  }
+
+  @Override
+  public WxMaUserService getUserService() {
+    return this.userService;
+  }
+
+  @Override
+  public WxMaQrcodeService getQrcodeService() {
+    return this.qrCodeService;
+  }
+
+  @Override
+  public WxMaTemplateService getTemplateService() {
+    return this.templateService;
+  }
+
+  @Override
+  public WxMaSubscribeService getSubscribeService() {
+    return this.subscribeService;
+  }
+
+  @Override
+  public WxMaAnalysisService getAnalysisService() {
+    return this.analysisService;
+  }
+
+  @Override
+  public WxMaCodeService getCodeService() {
+    return this.codeService;
+  }
+
+  @Override
+  public WxMaJsapiService getJsapiService() {
+    return this.jsapiService;
+  }
+
+  @Override
+  public WxMaSettingService getSettingService() {
+    return this.settingService;
+  }
+
+  @Override
+  public WxMaShareService getShareService() {
+    return this.shareService;
+  }
+
+  @Override
+  public WxMaRunService getRunService() {
+    return this.runService;
+  }
+
+  @Override
+  public WxMaSecCheckService getSecCheckService() {
+    return this.secCheckService;
+  }
+
+  @Override
+  public WxMaPluginService getPluginService() {
+    return this.pluginService;
+  }
+
+  @Override
+  public WxMaExpressService getExpressService() {
+    return this.expressService;
+  }
+
+  @Override
+  public WxMaCloudService getCloudService() {
+    return this.cloudService;
+  }
+
+  @Override
+  public WxMaLiveService getLiveService() {
+    return this.liveService;
+  }
+}
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
new file mode 100644
index 0000000000..c69772a5d8
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceHttpClientImpl.java
@@ -0,0 +1,88 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import lombok.extern.slf4j.Slf4j;
+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.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.BasicResponseHandler;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+import java.io.IOException;
+
+/**
+ * @author Binary Wang
+ */
+@Slf4j
+public class WxMaServiceHttpClientImpl extends BaseWxMaServiceImpl {
+  private CloseableHttpClient httpClient;
+  private HttpHost httpProxy;
+
+  @Override
+  public void initHttp() {
+    WxMaConfig configStorage = this.getWxMaConfig();
+    ApacheHttpClientBuilder apacheHttpClientBuilder = configStorage.getApacheHttpClientBuilder();
+    if (null == apacheHttpClientBuilder) {
+      apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get();
+    }
+
+    apacheHttpClientBuilder.httpProxyHost(configStorage.getHttpProxyHost())
+      .httpProxyPort(configStorage.getHttpProxyPort())
+      .httpProxyUsername(configStorage.getHttpProxyUsername())
+      .httpProxyPassword(configStorage.getHttpProxyPassword());
+
+    if (configStorage.getHttpProxyHost() != null && configStorage.getHttpProxyPort() > 0) {
+      this.httpProxy = new HttpHost(configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort());
+    }
+
+    this.httpClient = apacheHttpClientBuilder.build();
+  }
+
+  @Override
+  public CloseableHttpClient getRequestHttpClient() {
+    return httpClient;
+  }
+
+  @Override
+  public HttpHost getRequestHttpProxy() {
+    return httpProxy;
+  }
+
+  @Override
+  public HttpType getRequestType() {
+    return HttpType.APACHE_HTTP;
+  }
+
+  @Override
+  protected String doGetAccessTokenRequest() throws IOException {
+    String url = String.format(WxMaService.GET_ACCESS_TOKEN_URL, this.getWxMaConfig().getAppid(), this.getWxMaConfig().getSecret());
+
+    HttpGet httpGet = null;
+    CloseableHttpResponse response = null;
+    try {
+      httpGet = new HttpGet(url);
+      if (this.getRequestHttpProxy() != null) {
+        RequestConfig config = RequestConfig.custom().setProxy(this.getRequestHttpProxy()).build();
+        httpGet.setConfig(config);
+      }
+      response = getRequestHttpClient().execute(httpGet);
+      return new BasicResponseHandler().handleResponse(response);
+    } finally {
+      if (httpGet != null) {
+        httpGet.releaseConnection();
+      }
+      if (response != null) {
+        try {
+          response.close();
+        } catch (IOException e) {
+        }
+      }
+    }
+  }
+
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
index dd134d9256..16478f8411 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
@@ -1,428 +1,11 @@
 package cn.binarywang.wx.miniapp.api.impl;
 
-import cn.binarywang.wx.miniapp.api.*;
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import cn.binarywang.wx.miniapp.config.WxMaConfig;
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableMap;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
-import me.chanjar.weixin.common.bean.WxAccessToken;
-import me.chanjar.weixin.common.error.WxError;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.DataUtils;
-import me.chanjar.weixin.common.util.crypto.SHA1;
-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.common.util.json.WxGsonBuilder;
-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;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.BasicResponseHandler;
-import org.apache.http.impl.client.CloseableHttpClient;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.locks.Lock;
-
-import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ErrorCode.*;
 
 /**
  * @author Binary Wang
  */
 @Slf4j
-public class WxMaServiceImpl implements WxMaService, RequestHttp {
-  private static final JsonParser JSON_PARSER = new JsonParser();
-  private CloseableHttpClient httpClient;
-  private HttpHost httpProxy;
-  private WxMaConfig wxMaConfig;
-
-  private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this);
-  private final WxMaMediaService materialService = new WxMaMediaServiceImpl(this);
-  private final WxMaUserService userService = new WxMaUserServiceImpl(this);
-  private final WxMaQrcodeService qrCodeService = new WxMaQrcodeServiceImpl(this);
-  private final WxMaTemplateService templateService = new WxMaTemplateServiceImpl(this);
-  private final WxMaAnalysisService analysisService = new WxMaAnalysisServiceImpl(this);
-  private final WxMaCodeService codeService = new WxMaCodeServiceImpl(this);
-  private final WxMaSettingService settingService = new WxMaSettingServiceImpl(this);
-  private final WxMaJsapiService jsapiService = new WxMaJsapiServiceImpl(this);
-  private final WxMaShareService shareService = new WxMaShareServiceImpl(this);
-  private final WxMaRunService runService = new WxMaRunServiceImpl(this);
-  private final WxMaSecCheckService secCheckService = new WxMaSecCheckServiceImpl(this);
-  private final WxMaPluginService pluginService = new WxMaPluginServiceImpl(this);
-  private final WxMaExpressService expressService = new WxMaExpressServiceImpl(this);
-  private final WxMaSubscribeService subscribeService = new WxMaSubscribeServiceImpl(this);
-  private final WxMaCloudService cloudService = new WxMaCloudServiceImpl(this);
-  private final WxMaLiveService liveService = new WxMaLiveServiceImpl(this);
-
-  private int retrySleepMillis = 1000;
-  private int maxRetryTimes = 5;
-
-  protected static final Gson GSON = new Gson();
-
-  @Override
-  public CloseableHttpClient getRequestHttpClient() {
-    return httpClient;
-  }
-
-  @Override
-  public HttpHost getRequestHttpProxy() {
-    return httpProxy;
-  }
-
-  @Override
-  public HttpType getRequestType() {
-    return HttpType.APACHE_HTTP;
-  }
-
-  @Override
-  public void initHttp() {
-    WxMaConfig configStorage = this.getWxMaConfig();
-    ApacheHttpClientBuilder apacheHttpClientBuilder = configStorage.getApacheHttpClientBuilder();
-    if (null == apacheHttpClientBuilder) {
-      apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get();
-    }
-
-    apacheHttpClientBuilder.httpProxyHost(configStorage.getHttpProxyHost())
-      .httpProxyPort(configStorage.getHttpProxyPort())
-      .httpProxyUsername(configStorage.getHttpProxyUsername())
-      .httpProxyPassword(configStorage.getHttpProxyPassword());
-
-    if (configStorage.getHttpProxyHost() != null && configStorage.getHttpProxyPort() > 0) {
-      this.httpProxy = new HttpHost(configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort());
-    }
-
-    this.httpClient = apacheHttpClientBuilder.build();
-  }
-
-  @Override
-  public RequestHttp getRequestHttp() {
-    return this;
-  }
-
-  @Override
-  public String getAccessToken(boolean forceRefresh) throws WxErrorException {
-    if (!this.getWxMaConfig().isAccessTokenExpired() && !forceRefresh) {
-      return this.getWxMaConfig().getAccessToken();
-    }
-
-    Lock lock = this.getWxMaConfig().getAccessTokenLock();
-    lock.lock();
-    try {
-      if (!this.getWxMaConfig().isAccessTokenExpired() && !forceRefresh) {
-        return this.getWxMaConfig().getAccessToken();
-      }
-      
-      String url = String.format(WxMaService.GET_ACCESS_TOKEN_URL, this.getWxMaConfig().getAppid(),
-        this.getWxMaConfig().getSecret());
-      try {
-        HttpGet httpGet = new HttpGet(url);
-        if (this.getRequestHttpProxy() != null) {
-          RequestConfig config = RequestConfig.custom().setProxy(this.getRequestHttpProxy()).build();
-          httpGet.setConfig(config);
-        }
-        try (CloseableHttpResponse response = getRequestHttpClient().execute(httpGet)) {
-          String resultContent = new BasicResponseHandler().handleResponse(response);
-          WxError error = WxError.fromJson(resultContent, WxType.MiniApp);
-          if (error.getErrorCode() != 0) {
-            throw new WxErrorException(error);
-          }
-          WxAccessToken accessToken = WxAccessToken.fromJson(resultContent);
-          this.getWxMaConfig().updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
-
-          return this.getWxMaConfig().getAccessToken();
-        } finally {
-          httpGet.releaseConnection();
-        }
-      } catch (IOException e) {
-        throw new RuntimeException(e);
-      }
-    } finally {
-      lock.unlock();
-    }
-
-  }
-
-  @Override
-  public String getPaidUnionId(String openid, String transactionId, String mchId, String outTradeNo)
-    throws WxErrorException {
-    Map params = new HashMap<>(8);
-    params.put("openid", openid);
-
-    if (StringUtils.isNotEmpty(transactionId)) {
-      params.put("transaction_id", transactionId);
-    }
-
-    if (StringUtils.isNotEmpty(mchId)) {
-      params.put("mch_id", mchId);
-    }
-
-    if (StringUtils.isNotEmpty(outTradeNo)) {
-      params.put("out_trade_no", outTradeNo);
-    }
-
-    String responseContent = this.get(GET_PAID_UNION_ID_URL, Joiner.on("&").withKeyValueSeparator("=").join(params));
-    WxError error = WxError.fromJson(responseContent, WxType.MiniApp);
-    if (error.getErrorCode() != 0) {
-      throw new WxErrorException(error);
-    }
-
-    return JSON_PARSER.parse(responseContent).getAsJsonObject().get("unionid").getAsString();
-  }
-
-  @Override
-  public WxMaJscode2SessionResult jsCode2SessionInfo(String jsCode) throws WxErrorException {
-    final WxMaConfig config = getWxMaConfig();
-    Map params = new HashMap<>(8);
-    params.put("appid", config.getAppid());
-    params.put("secret", config.getSecret());
-    params.put("js_code", jsCode);
-    params.put("grant_type", "authorization_code");
-
-    String result = get(JSCODE_TO_SESSION_URL, Joiner.on("&").withKeyValueSeparator("=").join(params));
-    return WxMaJscode2SessionResult.fromJson(result);
-  }
-
-  @Override
-  public void setDynamicData(int lifespan, String type, int scene, String data) throws WxErrorException {
-    JsonObject jsonObject = new JsonObject();
-    jsonObject.addProperty("lifespan", lifespan);
-    jsonObject.addProperty("query", WxGsonBuilder.create().toJson(ImmutableMap.of("type", type)));
-    jsonObject.addProperty("data", data);
-    jsonObject.addProperty("scene", scene);
-
-    this.post(SET_DYNAMIC_DATA_URL, jsonObject.toString());
-  }
-
-  @Override
-  public boolean checkSignature(String timestamp, String nonce, String signature) {
-    try {
-      return SHA1.gen(this.getWxMaConfig().getToken(), timestamp, nonce).equals(signature);
-    } catch (Exception e) {
-      log.error("Checking signature failed, and the reason is :" + e.getMessage());
-      return false;
-    }
-  }
-
-  @Override
-  public String getAccessToken() throws WxErrorException {
-    return getAccessToken(false);
-  }
-
-  @Override
-  public String get(String url, String queryParam) throws WxErrorException {
-    return execute(SimpleGetRequestExecutor.create(this), url, queryParam);
-  }
-
-  @Override
-  public String post(String url, String postData) throws WxErrorException {
-    return execute(SimplePostRequestExecutor.create(this), url, postData);
-  }
-
-  @Override
-  public String post(String url, Object obj) throws WxErrorException {
-    return this.execute(SimplePostRequestExecutor.create(this), url, WxGsonBuilder.create().toJson(obj));
-  }
-
-  /**
-   * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求
-   */
-  @Override
-  public  T execute(RequestExecutor executor, String uri, E data) throws WxErrorException {
-    int retryTimes = 0;
-    do {
-      try {
-        return this.executeInternal(executor, uri, data);
-      } catch (WxErrorException e) {
-        if (retryTimes + 1 > this.maxRetryTimes) {
-          log.warn("重试达到最大次数【{}】", maxRetryTimes);
-          //最后一次重试失败后,直接抛出异常,不再等待
-          throw new WxErrorException(WxError.builder()
-            .errorCode(e.getError().getErrorCode())
-            .errorMsg("微信服务端异常,超出重试次数!")
-            .build());
-        }
-
-        WxError error = e.getError();
-        // -1 系统繁忙, 1000ms后重试
-        if (error.getErrorCode() == -1) {
-          int sleepMillis = this.retrySleepMillis * (1 << retryTimes);
-          try {
-            log.warn("微信系统繁忙,{} ms 后重试(第{}次)", sleepMillis, retryTimes + 1);
-            Thread.sleep(sleepMillis);
-          } catch (InterruptedException e1) {
-            Thread.currentThread().interrupt();
-          }
-        } else {
-          throw e;
-        }
-      }
-    } while (retryTimes++ < this.maxRetryTimes);
-
-    log.warn("重试达到最大次数【{}】", this.maxRetryTimes);
-    throw new RuntimeException("微信服务端异常,超出重试次数");
-  }
-
-  private  T executeInternal(RequestExecutor executor, String uri, E data) throws WxErrorException {
-    E dataForLog = DataUtils.handleDataWithSecret(data);
-
-    if (uri.contains("access_token=")) {
-      throw new IllegalArgumentException("uri参数中不允许有access_token: " + uri);
-    }
-    String accessToken = getAccessToken(false);
-
-    String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "access_token=" + accessToken;
-
-    try {
-      T result = executor.execute(uriWithAccessToken, data, WxType.MiniApp);
-      log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result);
-      return result;
-    } catch (WxErrorException e) {
-      WxError error = e.getError();
-      /*
-       * 发生以下情况时尝试刷新access_token
-       */
-      if (error.getErrorCode() == ERR_40001
-        || error.getErrorCode() == ERR_42001
-        || error.getErrorCode() == ERR_40014) {
-        // 强制设置WxMaConfig的access token过期了,这样在下一次请求里就会刷新access token
-        Lock lock = this.getWxMaConfig().getAccessTokenLock();
-        lock.lock();
-        try {
-          if (StringUtils.equals(this.getWxMaConfig().getAccessToken(), accessToken)) {
-            this.getWxMaConfig().expireAccessToken();
-          }
-        } catch (Exception ex) {
-          this.getWxMaConfig().expireAccessToken();
-        } finally {
-          lock.unlock();
-        }
-        if (this.getWxMaConfig().autoRefreshToken()) {
-          return this.execute(executor, uri, data);
-        }
-      }
-
-      if (error.getErrorCode() != 0) {
-        log.error("\n【请求地址】: {}\n【请求参数】:{}\n【错误信息】:{}", uriWithAccessToken, dataForLog, error);
-        throw new WxErrorException(error, e);
-      }
-      return null;
-    } catch (IOException e) {
-      log.error("\n【请求地址】: {}\n【请求参数】:{}\n【异常信息】:{}", uriWithAccessToken, dataForLog, e.getMessage());
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public WxMaConfig getWxMaConfig() {
-    return this.wxMaConfig;
-  }
-
-  @Override
-  public void setWxMaConfig(WxMaConfig wxConfigProvider) {
-    this.wxMaConfig = wxConfigProvider;
-    this.initHttp();
-  }
-
-  @Override
-  public void setRetrySleepMillis(int retrySleepMillis) {
-    this.retrySleepMillis = retrySleepMillis;
-  }
-
-  @Override
-  public void setMaxRetryTimes(int maxRetryTimes) {
-    this.maxRetryTimes = maxRetryTimes;
-  }
-
-  @Override
-  public WxMaMsgService getMsgService() {
-    return this.kefuService;
-  }
-
-  @Override
-  public WxMaMediaService getMediaService() {
-    return this.materialService;
-  }
-
-  @Override
-  public WxMaUserService getUserService() {
-    return this.userService;
-  }
-
-  @Override
-  public WxMaQrcodeService getQrcodeService() {
-    return this.qrCodeService;
-  }
-
-  @Override
-  public WxMaTemplateService getTemplateService() {
-    return this.templateService;
-  }
-
-  @Override
-  public WxMaSubscribeService getSubscribeService() {
-    return this.subscribeService;
-  }
-
-  @Override
-  public WxMaAnalysisService getAnalysisService() {
-    return this.analysisService;
-  }
-
-  @Override
-  public WxMaCodeService getCodeService() {
-    return this.codeService;
-  }
-
-  @Override
-  public WxMaJsapiService getJsapiService() {
-    return this.jsapiService;
-  }
-
-  @Override
-  public WxMaSettingService getSettingService() {
-    return this.settingService;
-  }
-
-  @Override
-  public WxMaShareService getShareService() {
-    return this.shareService;
-  }
-
-  @Override
-  public WxMaRunService getRunService() {
-    return this.runService;
-  }
-
-  @Override
-  public WxMaSecCheckService getSecCheckService() {
-    return this.secCheckService;
-  }
-
-  @Override
-  public WxMaPluginService getPluginService() {
-    return this.pluginService;
-  }
-
-  @Override
-  public WxMaExpressService getExpressService() {
-    return this.expressService;
-  }
-
-  @Override
-  public WxMaCloudService getCloudService() {
-    return this.cloudService;
-  }
+public class WxMaServiceImpl extends WxMaServiceHttpClientImpl {
 
-  @Override
-  public WxMaLiveService getLiveService() {
-    return this.liveService;
-  }
 }
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
new file mode 100644
index 0000000000..984d0d3fe6
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceJoddHttpImpl.java
@@ -0,0 +1,59 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.ProxyInfo;
+import jodd.http.net.SocketHttpConnectionProvider;
+import me.chanjar.weixin.common.util.http.HttpType;
+
+import java.io.IOException;
+
+/**
+ * jodd-http方式实现.
+ *
+ * @author someone
+ */
+public class WxMaServiceJoddHttpImpl extends BaseWxMaServiceImpl {
+  private HttpConnectionProvider httpClient;
+  private ProxyInfo httpProxy;
+
+  @Override
+  public void initHttp() {
+    WxMaConfig configStorage = this.getWxMaConfig();
+    if (configStorage.getHttpProxyHost() != null && configStorage.getHttpProxyPort() > 0) {
+      this.httpProxy = new ProxyInfo(ProxyInfo.ProxyType.HTTP, configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort(), configStorage.getHttpProxyUsername(), configStorage.getHttpProxyPassword());
+    }
+    this.httpClient = new SocketHttpConnectionProvider();
+  }
+
+  @Override
+  public HttpConnectionProvider getRequestHttpClient() {
+    return httpClient;
+  }
+
+  @Override
+  public ProxyInfo getRequestHttpProxy() {
+    return httpProxy;
+  }
+
+  @Override
+  public HttpType getRequestType() {
+    return HttpType.JODD_HTTP;
+  }
+
+  @Override
+  protected String doGetAccessTokenRequest() throws IOException {
+    String url = String.format(WxMaService.GET_ACCESS_TOKEN_URL, this.getWxMaConfig().getAppid(), this.getWxMaConfig().getSecret());
+    HttpRequest request = HttpRequest.get(url);
+    if (this.getRequestHttpProxy() != null) {
+      SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider();
+      provider.useProxy(getRequestHttpProxy());
+
+      request.withConnectionProvider(provider);
+    }
+    return request.send().bodyText();
+  }
+
+}
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
new file mode 100644
index 0000000000..a36444d97a
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceOkHttpImpl.java
@@ -0,0 +1,72 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import me.chanjar.weixin.common.util.http.HttpType;
+import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
+import okhttp3.*;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * okhttp实现.
+ */
+public class WxMaServiceOkHttpImpl extends BaseWxMaServiceImpl {
+
+  private OkHttpClient httpClient;
+  private OkHttpProxyInfo httpProxy;
+
+  @Override
+  public void initHttp() {
+    WxMaConfig wxMpConfigStorage = this.getWxMaConfig();
+    //设置代理
+    if (wxMpConfigStorage.getHttpProxyHost() != null && wxMpConfigStorage.getHttpProxyPort() > 0) {
+      httpProxy = OkHttpProxyInfo.httpProxy(wxMpConfigStorage.getHttpProxyHost(),
+        wxMpConfigStorage.getHttpProxyPort(),
+        wxMpConfigStorage.getHttpProxyUsername(),
+        wxMpConfigStorage.getHttpProxyPassword());
+    }
+
+    OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
+    if (httpProxy != null) {
+      clientBuilder.proxy(getRequestHttpProxy().getProxy());
+
+      //设置授权
+      clientBuilder.authenticator(new Authenticator() {
+        @Override
+        public Request authenticate(Route route, Response response) throws IOException {
+          String credential = Credentials.basic(httpProxy.getProxyUsername(), httpProxy.getProxyPassword());
+          return response.request().newBuilder()
+            .header("Authorization", credential)
+            .build();
+        }
+      });
+    }
+    httpClient = clientBuilder.build();
+  }
+
+  @Override
+  public OkHttpClient getRequestHttpClient() {
+    return httpClient;
+  }
+
+  @Override
+  public OkHttpProxyInfo getRequestHttpProxy() {
+    return httpProxy;
+  }
+
+  @Override
+  public HttpType getRequestType() {
+    return HttpType.OK_HTTP;
+  }
+
+  @Override
+  protected String doGetAccessTokenRequest() throws IOException {
+    String url = String.format(WxMaService.GET_ACCESS_TOKEN_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();
+    }
+  }
+}
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 6cbf584c33..af3f37b793 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
@@ -1,5 +1,6 @@
 package me.chanjar.weixin.open.api.impl;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.config.WxMaConfig;
@@ -196,6 +197,7 @@ public WxOpenResult unbindTester(String wechatid) throws WxErrorException {
 
   /**
    * 解除绑定小程序体验者
+   *
    * @param userstr 人员对应的唯一字符串, 可通过获取已绑定的体验者列表获取人员对应的字符串
    * @return
    * @throws WxErrorException
@@ -306,7 +308,8 @@ public WxOpenResult codeCommit(Long templateId, String userVersion, String userD
   public File getTestQrcode(String pagePath, Map params) throws WxErrorException {
     WxMaQrcodeParam qrcodeParam = WxMaQrcodeParam.create(pagePath);
     qrcodeParam.addPageParam(params);
-    return execute(MaQrCodeRequestExecutor.create(getRequestHttp()), API_TEST_QRCODE, qrcodeParam);
+    WxMaService wxMaService = this;
+    return wxMaService.execute(MaQrCodeRequestExecutor.create(getRequestHttp()), API_TEST_QRCODE, qrcodeParam);
   }
 
   /**
@@ -547,7 +550,6 @@ public WxOpenMaQueryQuotaResult queryQuota() throws WxErrorException {
   }
 
 
-
   /**
    * 加急审核申请
    * 有加急次数的第三方可以通过该接口,对已经提审的小程序进行加急操作,加急后的小程序预计2-12小时内审完。
@@ -564,6 +566,7 @@ public Boolean speedAudit(Long auditid) throws WxErrorException {
 
   /**
    * (1)增加或修改二维码规则
+   *
    * @param wxQrcodeJumpRule
    * @return
    * @throws WxErrorException
@@ -576,6 +579,7 @@ public WxOpenResult addQrcodeJump(WxQrcodeJumpRule wxQrcodeJumpRule) throws WxEr
 
   /**
    * (2)获取已设置的二维码规则
+   *
    * @return
    * @throws WxErrorException
    */
@@ -587,6 +591,7 @@ public WxGetQrcodeJumpResult getQrcodeJump() throws WxErrorException {
 
   /**
    * (3)获取校验文件名称及内容
+   *
    * @return
    * @throws WxErrorException
    */
@@ -598,6 +603,7 @@ public WxDownlooadQrcodeJumpResult downloadQrcodeJump() throws WxErrorException
 
   /**
    * (4)删除已设置的二维码规则
+   *
    * @param prefix
    * @return
    * @throws WxErrorException
@@ -612,6 +618,7 @@ public WxOpenResult deleteQrcodeJump(String prefix) throws WxErrorException {
 
   /**
    * (5)发布已设置的二维码规则
+   *
    * @param prefix
    * @return
    * @throws WxErrorException

From b52e676040fc1798a979f68b4d1095fe1a49cf09 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=A9=AC=E8=82=87=E6=98=8E?= 
Date: Wed, 3 Jun 2020 13:46:43 +0800
Subject: [PATCH 15/90] =?UTF-8?q?:bug:=20#1600=20=E4=BF=AE=E5=A4=8D?=
 =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=88=87=E6=8D=A2=E5=88=B0=E5=88=9D=E5=A7=8B?=
 =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E9=85=8D=E7=BD=AE=E7=9A=84=E9=97=AE?=
 =?UTF-8?q?=E9=A2=98=E5=B9=B6=E5=AE=8C=E5=96=84=E4=BA=86removeConfigStorag?=
 =?UTF-8?q?e=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* 修复无法切换到初始公众号配置的问题

* 完善removeConfigStorage
---
 .../weixin/mp/api/impl/BaseWxMpServiceImpl.java    | 14 +++++++++++++-
 .../mp/api/impl/BaseWxMpServiceImplTest.java       |  1 +
 2 files changed, 14 insertions(+), 1 deletion(-)

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 e3d7e7ad39..043ddd2be9 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
@@ -414,7 +414,7 @@ protected String extractAccessToken(String resultContent) throws WxErrorExceptio
 
   @Override
   public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) {
-    final String defaultMpId = WxMpConfigStorageHolder.get();
+    final String defaultMpId = wxConfigProvider.getAppId();
     this.setMultiConfigStorages(ImmutableMap.of(defaultMpId, wxConfigProvider), defaultMpId);
   }
 
@@ -440,6 +440,18 @@ public void addConfigStorage(String mpId, WxMpConfigStorage configStorages) {
   @Override
   public void removeConfigStorage(String mpId) {
     synchronized (this) {
+      if (this.configStorageMap.size() == 1) {
+        this.configStorageMap.remove(mpId);
+        log.warn("已删除最后一个公众号配置:{},须立即使用setWxMpConfigStorage或setMultiConfigStorages添加配置", mpId);
+        return;
+      }
+      if (WxMpConfigStorageHolder.get().equals(mpId)) {
+        this.configStorageMap.remove(mpId);
+        final String defaultMpId = this.configStorageMap.keySet().iterator().next();
+        WxMpConfigStorageHolder.set(defaultMpId);
+        log.warn("已删除默认公众号配置,公众号【{}】被设为默认配置", defaultMpId);
+        return;
+      }
       this.configStorageMap.remove(mpId);
     }
   }
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
index f35a7d4658..77aaf56a1d 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
@@ -41,6 +41,7 @@ public void testSwitchover() {
     assertTrue(this.wxService.switchover("another"));
     assertThat(WxMpConfigStorageHolder.get()).isEqualTo("another");
     assertFalse(this.wxService.switchover("whatever"));
+    assertFalse(this.wxService.switchover("default"));
   }
 
   @Test

From f14b33a6420610643ceeca8c095975676752c209 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Thu, 4 Jun 2020 20:39:38 +0800
Subject: [PATCH 16/90] =?UTF-8?q?:art:=20#1599=20=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E8=8E=B7=E5=8F=96=E6=89=93=E5=8D=A1=E6=95=B0?=
 =?UTF-8?q?=E6=8D=AE=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E=E7=B1=BB=E5=A2=9E?=
 =?UTF-8?q?=E5=8A=A0=E6=89=93=E5=8D=A1=E8=AE=BE=E5=A4=87id=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    | 45 +++++++++++++++++++
 .../result/WxPaySendRedpackResultTest.java    |  2 +-
 2 files changed, 46 insertions(+), 1 deletion(-)

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 b76553ca63..4ab801de1a 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
@@ -16,39 +16,84 @@
 public class WxCpCheckinData implements Serializable {
   private static final long serialVersionUID = 1915820330847799605L;
 
+  /**
+   * userid	用户id
+   */
   @SerializedName("userid")
   private String userId;
 
+  /**
+   * groupname	打卡规则名称
+   */
   @SerializedName("groupname")
   private String groupName;
 
+  /**
+   * checkin_type	打卡类型。字符串,目前有:上班打卡,下班打卡,外出打卡
+   */
   @SerializedName("checkin_type")
   private String checkinType;
 
+  /**
+   * exception_type	异常类型,字符串,包括:时间异常,地点异常,未打卡,wifi异常,非常用设备。如果有多个异常,以分号间隔
+   */
   @SerializedName("exception_type")
   private String exceptionType;
 
+  /**
+   * checkin_time	打卡时间。Unix时间戳
+   */
   @SerializedName("checkin_time")
   private Long checkinTime;
 
+  /**
+   * location_title	打卡地点title
+   */
   @SerializedName("location_title")
   private String locationTitle;
 
+  /**
+   * location_detail	打卡地点详情
+   */
   @SerializedName("location_detail")
   private String locationDetail;
 
+  /**
+   * wifiname	打卡wifi名称
+   */
   @SerializedName("wifiname")
   private String wifiName;
 
+  /**
+   * wifimac	打卡的MAC地址/bssid
+   */
   @SerializedName("wifimac")
   private String wifiMac;
 
+  /**
+   * notes	打卡备注
+   */
   private String notes;
 
+  /**
+   * mediaids	打卡的附件media_id,可使用media/get获取附件
+   */
   @SerializedName("mediaids")
   private List mediaIds;
 
+  /**
+   * lat	位置打卡地点纬度,是实际纬度的1000000倍,与腾讯地图一致采用GCJ-02坐标系统标准
+   */
   private Integer lat;
 
+  /**
+   * lng	位置打卡地点经度,是实际经度的1000000倍,与腾讯地图一致采用GCJ-02坐标系统标准
+   */
   private Integer lng;
+
+  /**
+   * deviceid	打卡设备id
+   */
+  @SerializedName("deviceid")
+  private String deviceId;
 }
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResultTest.java
index cb9007828f..8ad4c246af 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResultTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPaySendRedpackResultTest.java
@@ -68,6 +68,6 @@ public void loadFailureResult() {
     Assert.assertEquals("FAIL", wxMpRedpackResult.getReturnCode());
     Assert.assertEquals("FAIL", wxMpRedpackResult.getResultCode());
     Assert.assertEquals("onqOjjmM1tad-3ROpncN-yUfa6uI", wxMpRedpackResult.getReOpenid());
-    Assert.assertEquals(Integer.valueOf(1), wxMpRedpackResult.getTotalAmount());
+    Assert.assertEquals(1, wxMpRedpackResult.getTotalAmount().intValue());
   }
 }

From 93414199d62d34c6cf529712743c8b7fdfe74f47 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 6 Jun 2020 17:15:24 +0800
Subject: [PATCH 17/90] =?UTF-8?q?:art:=20=E8=A7=84=E8=8C=83=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

---
 .../open/api/WxOpenComponentService.java      |   3 +-
 .../weixin/open/api/WxOpenMaService.java      | 221 ++++++++---
 .../api/impl/WxOpenComponentServiceImpl.java  |  41 +-
 .../api/impl/WxOpenFastMaServiceImpl.java     |   6 +-
 .../open/api/impl/WxOpenMaServiceImpl.java    | 353 ++----------------
 .../impl/WxOpenComponentServiceImplTest.java  | 162 ++++++++
 .../api/impl/WxOpenFastMaServiceImplTest.java | 218 +++++++++++
 .../api/impl/WxOpenMaServiceImplTest.java     | 334 +++++++++++++++++
 8 files changed, 929 insertions(+), 409 deletions(-)
 create mode 100644 weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java
 create mode 100644 weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImplTest.java
 create mode 100644 weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImplTest.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 5f4994cd2f..98ff8e038c 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,7 +1,6 @@
 package me.chanjar.weixin.open.api;
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import com.google.gson.JsonObject;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
@@ -10,7 +9,6 @@
 import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
 import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
 import me.chanjar.weixin.open.bean.result.*;
-import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
 
 import java.util.List;
 
@@ -218,6 +216,7 @@ public interface WxOpenComponentService {
    *
    * @param appId 公众号/小程序的appId
    * @return .
+   * @throws WxErrorException .
    */
   WxOpenCreateResult createOpenAccount(String appId) 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 c64156d04a..ccaeeff019 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
@@ -17,10 +17,9 @@
  * 
  *
  * @author yqx
- * @date 2018/9/12
+ * @date 2018 /9/12
  */
 public interface WxOpenMaService extends WxMaService {
-
   /**
    * 设置小程序服务器域名.
    *
@@ -73,11 +72,8 @@ public interface WxOpenMaService extends WxMaService {
   /**
    * 以下接口基础信息设置
    * 

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

- */ - - /** * 1. 设置小程序隐私设置(是否可被搜索) */ String API_CHANGE_WXA_SEARCH_STATUS = "https://api.weixin.qq.com/wxa/changewxasearchstatus"; @@ -101,11 +97,8 @@ public interface WxOpenMaService extends WxMaService { /** * 以下接口为三方平台代小程序实现的代码管理功能 *

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

- */ - - /** * 1. 为授权的小程序帐号上传小程序代码 */ String API_CODE_COMMIT = "https://api.weixin.qq.com/wxa/commit"; @@ -167,10 +160,8 @@ public interface WxOpenMaService extends WxMaService { /** * 14.设置小程序“扫普通链接二维码打开小程序”能力 - * + *

* https://mp.weixin.qq.com/debug/wxadoc/introduction/qrcode.html - */ - /** * 14.1 增加或修改二维码规则 */ String API_QRCODE_JUMP_ADD = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpadd"; @@ -229,112 +220,142 @@ public interface WxOpenMaService extends WxMaService { */ String API_SPEED_AUDIT = "https://api.weixin.qq.com/wxa/speedupaudit"; - /** * 获得小程序的域名配置信息 + * + * @return the domain + * @throws WxErrorException the wx error exception */ WxOpenMaDomainResult getDomain() throws WxErrorException; /** * 修改域名 * - * @param action delete删除, set覆盖, get获取 + * @param action delete删除, set覆盖, get获取 + * @param requestDomains the requestdomain list + * @param wsRequestDomains the wsrequestdomain list + * @param uploadDomains the uploaddomain list + * @param downloadDomains the downloaddomain list + * @return the wx open ma domain result + * @throws WxErrorException the wx error exception */ - WxOpenMaDomainResult modifyDomain(String action, List requestdomainList, List wsrequestdomainList, List uploaddomainList, List downloaddomainList) throws WxErrorException; + WxOpenMaDomainResult modifyDomain(String action, List requestDomains, List wsRequestDomains, + List uploadDomains, List downloadDomains) throws WxErrorException; /** * 获取小程序的业务域名 * - * @return 直接返回字符串 + * @return 直接返回字符串 web view domain + * @throws WxErrorException the wx error exception */ String getWebViewDomain() throws WxErrorException; /** * 获取小程序的业务域名 * - * @return + * @return web view domain info + * @throws WxErrorException the wx error exception */ - public WxOpenMaWebDomainResult getWebViewDomainInfo() throws WxErrorException; + WxOpenMaWebDomainResult getWebViewDomainInfo() throws WxErrorException; /** * 设置小程序的业务域名 * - * @param action add添加, delete删除, set覆盖 - * @return 直接返回字符串 + * @param action add添加, delete删除, set覆盖 + * @param domainList the domain list + * @return 直接返回字符串 web view domain + * @throws WxErrorException the wx error exception */ String setWebViewDomain(String action, List domainList) throws WxErrorException; - /** * 设置小程序的业务域名 * * @param action add添加, delete删除, set覆盖 - * @param domainList - * @return + * @param domainList the domain list + * @return web view domain info + * @throws WxErrorException the wx error exception */ WxOpenMaWebDomainResult setWebViewDomainInfo(String action, List domainList) throws WxErrorException; /** * 获取小程序的信息 + * + * @return the account basic info + * @throws WxErrorException the wx error exception */ String getAccountBasicInfo() throws WxErrorException; /** * 绑定小程序体验者 * - * @param wechatid 体验者微信号(不是openid) - * @return - * @throws WxErrorException + * @param wechatId 体验者微信号(不是openid) + * @return wx open ma bind tester result + * @throws WxErrorException the wx error exception */ - WxOpenMaBindTesterResult bindTester(String wechatid) throws WxErrorException; + WxOpenMaBindTesterResult bindTester(String wechatId) throws WxErrorException; /** * 解除绑定小程序体验者 * - * @param wechatid 体验者微信号(不是openid) + * @param wechatId 体验者微信号(不是openid) + * @return the wx open result + * @throws WxErrorException the wx error exception */ - WxOpenResult unbindTester(String wechatid) throws WxErrorException; + WxOpenResult unbindTester(String wechatId) throws WxErrorException; /** * 解除绑定小程序体验者,其他平台绑定的体验者无法获取到wechatid,可用此方法解绑,详见文档 * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/unbind_tester.html * - * @param userstr 人员对应的唯一字符串, 可通过获取已绑定的体验者列表获取人员对应的字符串 + * @param userStr 人员对应的唯一字符串, 可通过获取已绑定的体验者列表获取人员对应的字符串 + * @return the wx open result + * @throws WxErrorException the wx error exception */ - WxOpenResult unbindTesterByUserstr(String userstr) throws WxErrorException; + WxOpenResult unbindTesterByUserStr(String userStr) throws WxErrorException; /** * 获得体验者列表 + * + * @return the tester list + * @throws WxErrorException the wx error exception */ WxOpenMaTesterListResult getTesterList() throws WxErrorException; - /** * 设置小程序隐私设置(是否可被搜索) * * @param status 1表示不可搜索,0表示可搜索 + * @return the wx open result + * @throws WxErrorException the wx error exception */ - public WxOpenResult changeWxaSearchStatus(Integer status) throws WxErrorException; - + WxOpenResult changeWxaSearchStatus(Integer status) throws WxErrorException; /** * 2. 查询小程序当前隐私设置(是否可被搜索) + * + * @return the wxa search status + * @throws WxErrorException the wx error exception */ - public WxOpenMaSearchStatusResult getWxaSearchStatus() throws WxErrorException; + WxOpenMaSearchStatusResult getWxaSearchStatus() throws WxErrorException; /** * 3.1 获取展示的公众号信息 + * + * @return the show wxa item + * @throws WxErrorException the wx error exception */ - public WxOpenMaShowItemResult getShowWxaItem() throws WxErrorException; - + WxOpenMaShowItemResult getShowWxaItem() throws WxErrorException; /** * 3.2 设置展示的公众号 * * @param flag 0 关闭,1 开启 - * @param mpappid 如果开启,需要传新的公众号appid + * @param mpAppId 如果开启,需要传新的公众号appid + * @return the wx open result + * @throws WxErrorException the wx error exception */ - public WxOpenResult updateShowwxaitem(Integer flag, String mpappid) throws WxErrorException; + WxOpenResult updateShowWxaItem(Integer flag, String mpAppId) throws WxErrorException; /** * 1、为授权的小程序帐号上传小程序代码 @@ -343,11 +364,18 @@ public interface WxOpenMaService extends WxMaService { * @param userVersion 用户定义版本 * @param userDesc 用户定义版本描述 * @param extInfo 第三方自定义的配置 + * @return the wx open result + * @throws WxErrorException the wx error exception */ WxOpenResult codeCommit(Long templateId, String userVersion, String userDesc, WxMaOpenCommitExtInfo extInfo) throws WxErrorException; /** * 获取体验小程序的体验二维码 + * + * @param pagePath the page path + * @param params the params + * @return the test qrcode + * @throws WxErrorException the wx error exception */ File getTestQrcode(String pagePath, Map params) throws WxErrorException; @@ -356,124 +384,203 @@ public interface WxOpenMaService extends WxMaService { *

* 注意:该接口可获取已设置的二级类目及用于代码审核的可选三级类目。 *

+ * + * @return the category list + * @throws WxErrorException the wx error exception */ WxOpenMaCategoryListResult getCategoryList() throws WxErrorException; /** * 获取小程序的第三方提交代码的页面配置(仅供第三方开发者代小程序调用) * - * @return - * @throws WxErrorException + * @return page list + * @throws WxErrorException the wx error exception */ WxOpenMaPageListResult getPageList() throws WxErrorException; /** * 将第三方提交的代码包提交审核(仅供第三方开发者代小程序调用) + * + * @param submitAuditMessage the submit audit message + * @return the wx open ma submit audit result + * @throws WxErrorException the wx error exception */ WxOpenMaSubmitAuditResult submitAudit(WxOpenMaSubmitAuditMessage submitAuditMessage) throws WxErrorException; /** * 查询某个指定版本的审核状态(仅供第三方代小程序调用) + * + * @param auditId the auditid + * @return the audit status + * @throws WxErrorException the wx error exception */ - WxOpenMaQueryAuditResult getAuditStatus(Long auditid) throws WxErrorException; + WxOpenMaQueryAuditResult getAuditStatus(Long auditId) throws WxErrorException; /** - * 查询最新一次提交的审核状态(仅供第三方代小程序调用). + * 8. 查询最新一次提交的审核状态(仅供第三方代小程序调用) + * + * @return 。 + * @throws WxErrorException 。 */ WxOpenMaQueryAuditResult getLatestAuditStatus() throws WxErrorException; /** - * 发布已通过审核的小程序(仅供第三方代小程序调用). + * 9. 发布已通过审核的小程序(仅供第三方代小程序调用) + *

+ * 请填写空的数据包,POST的json数据包为空即可。 + *

+ * + * @return 。 + * @throws WxErrorException 。 */ - WxOpenResult releaesAudited() throws WxErrorException; + WxOpenResult releaseAudited() throws WxErrorException; /** * 10. 修改小程序线上代码的可见状态(仅供第三方代小程序调用) + * + * @param action the action + * @return the wx open result + * @throws WxErrorException the wx error exception */ - public WxOpenResult changeVisitstatus(String action) throws WxErrorException; - + WxOpenResult changeVisitStatus(String action) throws WxErrorException; /** * 11. 小程序版本回退(仅供第三方代小程序调用) + * + * @return 。 + * @throws WxErrorException 。 */ - WxOpenResult revertCodeReleaes() throws WxErrorException; + WxOpenResult revertCodeRelease() throws WxErrorException; /** * 15. 小程序审核撤回 + *

* 单个帐号每天审核撤回次数最多不超过1次,一个月不超过10次。 + *

+ * + * @return 。 + * @throws WxErrorException 。 */ WxOpenResult undoCodeAudit() throws WxErrorException; /** - * 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) + * 12. 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) + * + * @return 。 + * @throws WxErrorException 。 */ String getSupportVersion() throws WxErrorException; /** - * 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) + * 12. 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) + * + * @return . support version info + * @throws WxErrorException . */ WxOpenMaWeappSupportVersionResult getSupportVersionInfo() throws WxErrorException; /** * 设置最低基础库版本(仅供第三方代小程序调用) + * + * @param version the version + * @return the support version + * @throws WxErrorException the wx error exception */ String setSupportVersion(String version) throws WxErrorException; /** - * 设置最低基础库版本(仅供第三方代小程序调用) + * 13. 设置最低基础库版本(仅供第三方代小程序调用) + * + * @param version the version + * @return support version info + * @throws WxErrorException the wx error exception */ WxOpenResult setSupportVersionInfo(String version) throws WxErrorException; /** * 16. 小程序分阶段发布 - 1)分阶段发布接口 + * + * @param grayPercentage 灰度的百分比,1到100的整数 + * @return . wx open result + * @throws WxErrorException . */ - WxOpenResult grayrelease(Integer grayPercentage) throws WxErrorException; + WxOpenResult grayRelease(Integer grayPercentage) throws WxErrorException; /** * 16. 小程序分阶段发布 - 2)取消分阶段发布 + * + * @return . wx open result + * @throws WxErrorException . */ - WxOpenResult revertgrayrelease() throws WxErrorException; + WxOpenResult revertGrayRelease() throws WxErrorException; /** * 16. 小程序分阶段发布 - 3)查询当前分阶段发布详情 + * + * @return . gray release plan + * @throws WxErrorException . */ - WxOpenMaGrayReleasePlanResult getgrayreleaseplan() throws WxErrorException; - + WxOpenMaGrayReleasePlanResult getGrayReleasePlan() throws WxErrorException; /** * 查询服务商的当月提审限额和加急次数(Quota) * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/code/query_quota.html + * + * @return the wx open ma query quota result + * @throws WxErrorException the wx error exception */ WxOpenMaQueryQuotaResult queryQuota() throws WxErrorException; /** * 加急审核申请 * 有加急次数的第三方可以通过该接口,对已经提审的小程序进行加急操作,加急后的小程序预计2-12小时内审完。 + * + * @param auditId the auditid + * @return the boolean + * @throws WxErrorException the wx error exception */ - Boolean speedAudit(Long auditid) throws WxErrorException; + Boolean speedAudit(Long auditId) throws WxErrorException; /** * (1)增加或修改二维码规则 + * + * @param wxQrcodeJumpRule the wx qrcode jump rule + * @return the wx open result + * @throws WxErrorException the wx error exception */ WxOpenResult addQrcodeJump(WxQrcodeJumpRule wxQrcodeJumpRule) throws WxErrorException; /** * (2)获取已设置的二维码规则 + * + * @return the qrcode jump + * @throws WxErrorException the wx error exception */ WxGetQrcodeJumpResult getQrcodeJump() throws WxErrorException; /** * (3)获取校验文件名称及内容 + * + * @return the wx downlooad qrcode jump result + * @throws WxErrorException the wx error exception */ WxDownlooadQrcodeJumpResult downloadQrcodeJump() throws WxErrorException; /** * (4)删除已设置的二维码规则 + * + * @param prefix the prefix + * @return the wx open result + * @throws WxErrorException the wx error exception */ WxOpenResult deleteQrcodeJump(String prefix) throws WxErrorException; /** * (5)发布已设置的二维码规则 + * + * @param prefix the prefix + * @return the wx open result + * @throws WxErrorException the wx error exception */ WxOpenResult publishQrcodeJump(String prefix) 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 82032eaf63..e111b5a18b 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 @@ -4,6 +4,8 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.crypto.SHA1; @@ -18,8 +20,6 @@ import me.chanjar.weixin.open.bean.result.*; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.List; import java.util.Map; @@ -30,18 +30,15 @@ /** * @author 007 */ +@Slf4j +@AllArgsConstructor public class WxOpenComponentServiceImpl implements WxOpenComponentService { private static final JsonParser JSON_PARSER = new JsonParser(); private static final Map WX_OPEN_MA_SERVICE_MAP = new ConcurrentHashMap<>(); private static final Map WX_OPEN_MP_SERVICE_MAP = new ConcurrentHashMap<>(); private static final Map WX_OPEN_FAST_MA_SERVICE_MAP = new ConcurrentHashMap<>(); - protected final Logger log = LoggerFactory.getLogger(this.getClass()); - private WxOpenService wxOpenService; - - public WxOpenComponentServiceImpl(WxOpenService wxOpenService) { - this.wxOpenService = wxOpenService; - } + private final WxOpenService wxOpenService; @Override public WxMpService getWxMpServiceByAppid(String appId) { @@ -228,41 +225,33 @@ public String getPreAuthUrl(String redirectUri) throws WxErrorException { } @Override - public String getPreAuthUrl(String redirectURI, String authType, String bizAppid) throws WxErrorException { - return createPreAuthUrl(redirectURI, authType, bizAppid, false); + public String getPreAuthUrl(String redirectUri, String authType, String bizAppid) throws WxErrorException { + return createPreAuthUrl(redirectUri, authType, bizAppid, false); } @Override - public String getMobilePreAuthUrl(String redirectURI) throws WxErrorException { - return getMobilePreAuthUrl(redirectURI, null, null); + public String getMobilePreAuthUrl(String redirectUri) throws WxErrorException { + return getMobilePreAuthUrl(redirectUri, null, null); } @Override - public String getMobilePreAuthUrl(String redirectURI, String authType, String bizAppid) throws WxErrorException { - return createPreAuthUrl(redirectURI, authType, bizAppid, true); + public String getMobilePreAuthUrl(String redirectUri, String authType, String bizAppid) throws WxErrorException { + return createPreAuthUrl(redirectUri, authType, bizAppid, true); } /** * 创建预授权链接 - * - * @param redirectURI - * @param authType - * @param bizAppid - * @param isMobile 是否移动端预授权 - * @return - * @throws WxErrorException */ - private String createPreAuthUrl(String redirectURI, String authType, String bizAppid, boolean isMobile) throws WxErrorException { + private String createPreAuthUrl(String redirectUri, String authType, String bizAppid, boolean isMobile) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("component_appid", getWxOpenConfigStorage().getComponentAppId()); String responseContent = post(API_CREATE_PREAUTHCODE_URL, jsonObject.toString()); jsonObject = WxGsonBuilder.create().fromJson(responseContent, JsonObject.class); - StringBuilder preAuthUrl = new StringBuilder(String.format((isMobile ? COMPONENT_MOBILE_LOGIN_PAGE_URL : COMPONENT_LOGIN_PAGE_URL), + String preAuthUrlStr = String.format((isMobile ? COMPONENT_MOBILE_LOGIN_PAGE_URL : COMPONENT_LOGIN_PAGE_URL), getWxOpenConfigStorage().getComponentAppId(), jsonObject.get("pre_auth_code").getAsString(), - URIUtil.encodeURIComponent(redirectURI))); - String preAuthUrlStr = preAuthUrl.toString(); + URIUtil.encodeURIComponent(redirectUri)); if (StringUtils.isNotEmpty(authType)) { preAuthUrlStr = preAuthUrlStr.replace("&auth_type=xxx", "&auth_type=" + authType); } else { @@ -337,7 +326,7 @@ public WxOpenAuthorizerInfoResult getAuthorizerInfo(String authorizerAppid) thro @Override public WxOpenAuthorizerListResult getAuthorizerList(int begin, int len) throws WxErrorException { - begin = begin < 0 ? 0 : begin; + begin = Math.max(begin, 0); len = len == 0 ? 10 : len; JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("component_appid", getWxOpenConfigStorage().getComponentAppId()); 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 01a808ed83..2cea9530bb 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 @@ -22,9 +22,9 @@ * @since 2019/1/23 15:27 */ public class WxOpenFastMaServiceImpl extends WxMaServiceImpl implements WxOpenFastMaService { - private WxOpenComponentService wxOpenComponentService; - private WxMaConfig wxMaConfig; - private String appId; + private final WxOpenComponentService wxOpenComponentService; + private final WxMaConfig wxMaConfig; + private final String appId; public WxOpenFastMaServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) { this.wxOpenComponentService = wxOpenComponentService; 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 af3f37b793..a8c252bae0 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 @@ -21,18 +21,19 @@ import java.util.Map; /** - * @author 007 *
  *     增加开放平台代小程序管理服务能力
  *     说明:这里让这个服务公开便于调用者模拟本地测试服务
  * 
+ * + * @author 007 * @author yqx * @date 2018-09-12 */ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaService { - private WxOpenComponentService wxOpenComponentService; - private WxMaConfig wxMaConfig; - private String appId; + private final WxOpenComponentService wxOpenComponentService; + private final WxMaConfig wxMaConfig; + private final String appId; public WxOpenMaServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) { this.wxOpenComponentService = wxOpenComponentService; @@ -56,72 +57,38 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException { return wxOpenComponentService.getAuthorizerAccessToken(appId, forceRefresh); } - /** - * 获得小程序的域名配置信息 - * - * @return - */ @Override public WxOpenMaDomainResult getDomain() throws WxErrorException { return modifyDomain("get", null, null, null, null); } - /** - * 修改服务器域名 - * - * @param action delete删除, set覆盖, get获取 - * @param requestdomainList - * @param wsrequestdomainList - * @param uploaddomainList - * @param downloaddomainList - * @return - * @throws WxErrorException - */ @Override - public WxOpenMaDomainResult modifyDomain(String action, List requestdomainList, List wsrequestdomainList, List uploaddomainList, List downloaddomainList) throws WxErrorException { - + public WxOpenMaDomainResult modifyDomain(String action, List requestDomains, List wsRequestDomains, List uploadDomains, List downloadDomains) throws WxErrorException { // if (!"get".equals(action) && (requestdomainList == null || wsrequestdomainList == null || uploaddomainList == null || downloaddomainList == null)) { // throw new WxErrorException(WxError.builder().errorCode(44004).errorMsg("域名参数不能为空").build()); // } JsonObject requestJson = new JsonObject(); requestJson.addProperty("action", action); if (!"get".equals(action)) { - requestJson.add("requestdomain", toJsonArray(requestdomainList)); - requestJson.add("wsrequestdomain", toJsonArray(wsrequestdomainList)); - requestJson.add("uploaddomain", toJsonArray(uploaddomainList)); - requestJson.add("downloaddomain", toJsonArray(downloaddomainList)); + requestJson.add("requestdomain", toJsonArray(requestDomains)); + requestJson.add("wsrequestdomain", toJsonArray(wsRequestDomains)); + requestJson.add("uploaddomain", toJsonArray(uploadDomains)); + requestJson.add("downloaddomain", toJsonArray(downloadDomains)); } String response = post(API_MODIFY_DOMAIN, GSON.toJson(requestJson)); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaDomainResult.class); } - /** - * 获取小程序的业务域名 - * - * @return - */ @Override public String getWebViewDomain() throws WxErrorException { return setWebViewDomain("get", null); } - /** - * 获取小程序的业务域名 - * - * @return - */ @Override public WxOpenMaWebDomainResult getWebViewDomainInfo() throws WxErrorException { return setWebViewDomainInfo("get", null); } - /** - * 设置小程序的业务域名 - * - * @param action add添加, delete删除, set覆盖 - * @param domainList - * @return - */ @Override public String setWebViewDomain(String action, List domainList) throws WxErrorException { JsonObject requestJson = new JsonObject(); @@ -129,18 +96,10 @@ public String setWebViewDomain(String action, List domainList) throws Wx if (!"get".equals(action)) { requestJson.add("webviewdomain", toJsonArray(domainList)); } - String response = post(API_SET_WEBVIEW_DOMAIN, GSON.toJson(requestJson)); - //TODO 转化为对象返回 - return response; + return post(API_SET_WEBVIEW_DOMAIN, GSON.toJson(requestJson)); } - /** - * 设置小程序的业务域名 - * - * @param action add添加, delete删除, set覆盖 - * @return - */ @Override public WxOpenMaWebDomainResult setWebViewDomainInfo(String action, List domainList) throws WxErrorException { String response = this.setWebViewDomain(action, domainList); @@ -148,74 +107,36 @@ public WxOpenMaWebDomainResult setWebViewDomainInfo(String action, List } - /** - * 获取小程序的信息,GET请求 - *
-   *     注意:这里不能直接用小程序的access_token
-   *     //TODO 待调整
-   * 
- * - * @return - * @throws WxErrorException - */ @Override public String getAccountBasicInfo() throws WxErrorException { - String response = get(API_GET_ACCOUNT_BASICINFO, ""); - return response; + return get(API_GET_ACCOUNT_BASICINFO, ""); } - /** - * 绑定小程序体验者 - * - * @param wechatid 体验者微信号(不是openid) - * @return - * @throws WxErrorException - */ @Override - public WxOpenMaBindTesterResult bindTester(String wechatid) throws WxErrorException { + public WxOpenMaBindTesterResult bindTester(String wechatId) throws WxErrorException { JsonObject paramJson = new JsonObject(); - paramJson.addProperty("wechatid", wechatid); + paramJson.addProperty("wechatid", wechatId); String response = post(API_BIND_TESTER, GSON.toJson(paramJson)); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaBindTesterResult.class); } - /** - * 解除绑定小程序体验者 - * - * @param wechatid 体验者微信号(不是openid) - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult unbindTester(String wechatid) throws WxErrorException { + public WxOpenResult unbindTester(String wechatId) throws WxErrorException { JsonObject paramJson = new JsonObject(); - paramJson.addProperty("wechatid", wechatid); + paramJson.addProperty("wechatid", wechatId); String response = post(API_UNBIND_TESTER, GSON.toJson(paramJson)); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 解除绑定小程序体验者 - * - * @param userstr 人员对应的唯一字符串, 可通过获取已绑定的体验者列表获取人员对应的字符串 - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult unbindTesterByUserstr(String userstr) throws WxErrorException { + public WxOpenResult unbindTesterByUserStr(String userStr) throws WxErrorException { JsonObject paramJson = new JsonObject(); - paramJson.addProperty("userstr", userstr); + paramJson.addProperty("userstr", userStr); String response = post(API_UNBIND_TESTER, GSON.toJson(paramJson)); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 获得体验者列表 - * - * @return - * @throws WxErrorException - */ @Override public WxOpenMaTesterListResult getTesterList() throws WxErrorException { JsonObject paramJson = new JsonObject(); @@ -224,12 +145,6 @@ public WxOpenMaTesterListResult getTesterList() throws WxErrorException { return WxMaGsonBuilder.create().fromJson(response, WxOpenMaTesterListResult.class); } - - /** - * 设置小程序隐私设置(是否可被搜索) - * - * @param status 1表示不可搜索,0表示可搜索 - */ @Override public WxOpenResult changeWxaSearchStatus(Integer status) throws WxErrorException { JsonObject paramJson = new JsonObject(); @@ -238,53 +153,27 @@ public WxOpenResult changeWxaSearchStatus(Integer status) throws WxErrorExceptio return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - - /** - * 2. 查询小程序当前隐私设置(是否可被搜索) - */ @Override public WxOpenMaSearchStatusResult getWxaSearchStatus() throws WxErrorException { String response = get(API_GET_WXA_SEARCH_STATUS, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaSearchStatusResult.class); } - - /** - * 3.1 获取展示的公众号信息 - */ @Override public WxOpenMaShowItemResult getShowWxaItem() throws WxErrorException { String response = get(API_GET_SHOW_WXA_ITEM, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaShowItemResult.class); } - - /** - * 3.2 设置展示的公众号 - * - * @param flag 0 关闭,1 开启 - * @param mpappid 如果开启,需要传新的公众号appid - */ @Override - public WxOpenResult updateShowwxaitem(Integer flag, String mpappid) throws WxErrorException { + public WxOpenResult updateShowWxaItem(Integer flag, String mpAppId) throws WxErrorException { JsonObject paramJson = new JsonObject(); paramJson.addProperty("wxa_subscribe_biz_flag", flag); - paramJson.addProperty("appid", mpappid); + paramJson.addProperty("appid", mpAppId); String response = post(API_UPDATE_SHOW_WXA_ITEM, GSON.toJson(paramJson)); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - - /** - * 1、为授权的小程序帐号上传小程序代码 - * - * @param templateId 代码模板ID - * @param userVersion 用户定义版本 - * @param userDesc 用户定义版本描述 - * @param extInfo 第三方自定义的配置 - * @return - * @throws WxErrorException - */ @Override public WxOpenResult codeCommit(Long templateId, String userVersion, String userDesc, WxMaOpenCommitExtInfo extInfo) throws WxErrorException { JsonObject params = new JsonObject(); @@ -297,13 +186,6 @@ public WxOpenResult codeCommit(Long templateId, String userVersion, String userD return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 获取体验小程序的体验二维码 - * - * @param pagePath - * @param params - * @return - */ @Override public File getTestQrcode(String pagePath, Map params) throws WxErrorException { WxMaQrcodeParam qrcodeParam = WxMaQrcodeParam.create(pagePath); @@ -312,302 +194,144 @@ public File getTestQrcode(String pagePath, Map params) throws Wx return wxMaService.execute(MaQrCodeRequestExecutor.create(getRequestHttp()), API_TEST_QRCODE, qrcodeParam); } - /** - * 获取授权小程序帐号的可选类目 - *

- * 注意:该接口可获取已设置的二级类目及用于代码审核的可选三级类目。 - *

- * - * @return WxOpenMaCategoryListResult - * @throws WxErrorException - */ @Override public WxOpenMaCategoryListResult getCategoryList() throws WxErrorException { String response = get(API_GET_CATEGORY, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaCategoryListResult.class); } - /** - * 获取小程序的第三方提交代码的页面配置(仅供第三方开发者代小程序调用) - * - * @return - * @throws WxErrorException - */ @Override public WxOpenMaPageListResult getPageList() throws WxErrorException { String response = get(API_GET_PAGE, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaPageListResult.class); } - /** - * 将第三方提交的代码包提交审核(仅供第三方开发者代小程序调用) - * - * @param submitAuditMessage - * @return - * @throws WxErrorException - */ @Override public WxOpenMaSubmitAuditResult submitAudit(WxOpenMaSubmitAuditMessage submitAuditMessage) throws WxErrorException { String response = post(API_SUBMIT_AUDIT, GSON.toJson(submitAuditMessage)); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaSubmitAuditResult.class); } - /** - * 7. 查询某个指定版本的审核状态(仅供第三方代小程序调用) - * - * @param auditid - * @return - * @throws WxErrorException - */ @Override - public WxOpenMaQueryAuditResult getAuditStatus(Long auditid) throws WxErrorException { + public WxOpenMaQueryAuditResult getAuditStatus(Long auditId) throws WxErrorException { JsonObject params = new JsonObject(); - params.addProperty("auditid", auditid); + params.addProperty("auditid", auditId); String response = post(API_GET_AUDIT_STATUS, GSON.toJson(params)); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaQueryAuditResult.class); } - /** - * 8. 查询最新一次提交的审核状态(仅供第三方代小程序调用) - * - * @return - * @throws WxErrorException - */ @Override public WxOpenMaQueryAuditResult getLatestAuditStatus() throws WxErrorException { String response = get(API_GET_LATEST_AUDIT_STATUS, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaQueryAuditResult.class); } - /** - * 9. 发布已通过审核的小程序(仅供第三方代小程序调用) - *

- * 请填写空的数据包,POST的json数据包为空即可。 - *

- * - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult releaesAudited() throws WxErrorException { + public WxOpenResult releaseAudited() throws WxErrorException { JsonObject params = new JsonObject(); String response = post(API_RELEASE, GSON.toJson(params)); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - - /** - * 10. 修改小程序线上代码的可见状态(仅供第三方代小程序调用) - * - * @param action 设置可访问状态,发布后默认可访问,close为不可见,open为可见 - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult changeVisitstatus(String action) throws WxErrorException { + public WxOpenResult changeVisitStatus(String action) throws WxErrorException { JsonObject params = new JsonObject(); params.addProperty("action", action); String response = post(API_CHANGE_VISITSTATUS, GSON.toJson(params)); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - - /** - * 11. 小程序版本回退(仅供第三方代小程序调用) - * - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult revertCodeReleaes() throws WxErrorException { + public WxOpenResult revertCodeRelease() throws WxErrorException { String response = get(API_REVERT_CODE_RELEASE, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - - /** - * 15. 小程序审核撤回 - *

- * 单个帐号每天审核撤回次数最多不超过1次,一个月不超过10次。 - *

- * - * @return - * @throws WxErrorException - */ @Override public WxOpenResult undoCodeAudit() throws WxErrorException { String response = get(API_UNDO_CODE_AUDIT, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 12. 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) - * - * @return - * @throws WxErrorException - */ @Override public String getSupportVersion() throws WxErrorException { JsonObject params = new JsonObject(); - String response = post(API_GET_WEAPP_SUPPORT_VERSION, GSON.toJson(params)); - return response; + return post(API_GET_WEAPP_SUPPORT_VERSION, GSON.toJson(params)); } - - /** - * 12. 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) - * - * @return - * @throws WxErrorException - */ @Override public WxOpenMaWeappSupportVersionResult getSupportVersionInfo() throws WxErrorException { String response = this.getSupportVersion(); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaWeappSupportVersionResult.class); } - /** - * 13. 设置最低基础库版本(仅供第三方代小程序调用) - * - * @param version - * @return - * @throws WxErrorException - */ @Override public String setSupportVersion(String version) throws WxErrorException { JsonObject params = new JsonObject(); params.addProperty("version", version); - String response = post(API_SET_WEAPP_SUPPORT_VERSION, GSON.toJson(params)); - return response; + return post(API_SET_WEAPP_SUPPORT_VERSION, GSON.toJson(params)); } - - /** - * 13. 设置最低基础库版本(仅供第三方代小程序调用) - * - * @param version - * @return - * @throws WxErrorException - */ @Override public WxOpenResult setSupportVersionInfo(String version) throws WxErrorException { String response = this.setSupportVersion(version); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - - /** - * 16. 小程序分阶段发布 - 1)分阶段发布接口 - * - * @param grayPercentage 灰度的百分比,1到100的整数 - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult grayrelease(Integer grayPercentage) throws WxErrorException { + public WxOpenResult grayRelease(Integer grayPercentage) throws WxErrorException { JsonObject params = new JsonObject(); params.addProperty("gray_percentage", grayPercentage); String response = post(API_GRAY_RELEASE, GSON.toJson(params)); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - - /** - * 16. 小程序分阶段发布 - 2)取消分阶段发布 - * - * @return - * @throws WxErrorException - */ @Override - - public WxOpenResult revertgrayrelease() throws WxErrorException { + public WxOpenResult revertGrayRelease() throws WxErrorException { String response = get(API_REVERT_GRAY_RELEASE, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - - /** - * 16. 小程序分阶段发布 - 3)查询当前分阶段发布详情 - * - * @return - * @throws WxErrorException - */ @Override - public WxOpenMaGrayReleasePlanResult getgrayreleaseplan() throws WxErrorException { + public WxOpenMaGrayReleasePlanResult getGrayReleasePlan() throws WxErrorException { String response = get(API_GET_GRAY_RELEASE_PLAN, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaGrayReleasePlanResult.class); } - - /** - * 查询服务商的当月提审限额和加急次数(Quota) - * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/code/query_quota.html - */ @Override public WxOpenMaQueryQuotaResult queryQuota() throws WxErrorException { String response = get(API_QUERY_QUOTA, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaQueryQuotaResult.class); } - - /** - * 加急审核申请 - * 有加急次数的第三方可以通过该接口,对已经提审的小程序进行加急操作,加急后的小程序预计2-12小时内审完。 - */ @Override - public Boolean speedAudit(Long auditid) throws WxErrorException { + public Boolean speedAudit(Long auditId) throws WxErrorException { JsonObject params = new JsonObject(); - params.addProperty("auditid", auditid); + params.addProperty("auditid", auditId); String response = post(API_SPEED_AUDIT, GSON.toJson(params)); WxOpenResult result = WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); return result.isSuccess(); } - /** - * (1)增加或修改二维码规则 - * - * @param wxQrcodeJumpRule - * @return - * @throws WxErrorException - */ @Override public WxOpenResult addQrcodeJump(WxQrcodeJumpRule wxQrcodeJumpRule) throws WxErrorException { String response = post(API_QRCODE_JUMP_ADD, GSON.toJson(wxQrcodeJumpRule)); return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * (2)获取已设置的二维码规则 - * - * @return - * @throws WxErrorException - */ @Override public WxGetQrcodeJumpResult getQrcodeJump() throws WxErrorException { String response = post(API_QRCODE_JUMP_GET, "{}"); return WxMaGsonBuilder.create().fromJson(response, WxGetQrcodeJumpResult.class); } - /** - * (3)获取校验文件名称及内容 - * - * @return - * @throws WxErrorException - */ @Override public WxDownlooadQrcodeJumpResult downloadQrcodeJump() throws WxErrorException { String response = post(API_QRCODE_JUMP_DOWNLOAD, "{}"); return WxMaGsonBuilder.create().fromJson(response, WxDownlooadQrcodeJumpResult.class); } - /** - * (4)删除已设置的二维码规则 - * - * @param prefix - * @return - * @throws WxErrorException - */ @Override public WxOpenResult deleteQrcodeJump(String prefix) throws WxErrorException { JsonObject params = new JsonObject(); @@ -616,13 +340,6 @@ public WxOpenResult deleteQrcodeJump(String prefix) throws WxErrorException { return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * (5)发布已设置的二维码规则 - * - * @param prefix - * @return - * @throws WxErrorException - */ @Override public WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException { JsonObject params = new JsonObject(); @@ -631,12 +348,6 @@ public WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException { return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 将字符串对象转化为GsonArray对象 - * - * @param strList - * @return - */ private JsonArray toJsonArray(List strList) { JsonArray jsonArray = new JsonArray(); if (strList != null && !strList.isEmpty()) { 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 new file mode 100644 index 0000000000..0e8cba5c3c --- /dev/null +++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java @@ -0,0 +1,162 @@ +package me.chanjar.weixin.open.api.impl; + +import org.testng.annotations.Test; + +import static org.testng.Assert.*; + +/** + * 单元测试类. + * + * @author Binary Wang + * @date 2020-06-06 + */ +public class WxOpenComponentServiceImplTest { + + @Test + public void testGetWxMpServiceByAppid() { + } + + @Test + public void testGetWxMaServiceByAppid() { + } + + @Test + public void testGetWxFastMaServiceByAppid() { + } + + @Test + public void testGetWxOpenService() { + } + + @Test + public void testGetWxOpenConfigStorage() { + } + + @Test + public void testCheckSignature() { + } + + @Test + public void testGetComponentAccessToken() { + } + + @Test + public void testPost() { + } + + @Test + public void testTestPost() { + } + + @Test + public void testGet() { + } + + @Test + public void testTestGet() { + } + + @Test + public void testGetPreAuthUrl() { + } + + @Test + public void testTestGetPreAuthUrl() { + } + + @Test + public void testGetMobilePreAuthUrl() { + } + + @Test + public void testTestGetMobilePreAuthUrl() { + } + + @Test + public void testRoute() { + } + + @Test + public void testGetQueryAuth() { + } + + @Test + public void testGetAuthorizerInfo() { + } + + @Test + public void testGetAuthorizerList() { + } + + @Test + public void testGetAuthorizerOption() { + } + + @Test + public void testSetAuthorizerOption() { + } + + @Test + public void testGetAuthorizerAccessToken() { + } + + @Test + public void testOauth2getAccessToken() { + } + + @Test + public void testTestCheckSignature() { + } + + @Test + public void testOauth2refreshAccessToken() { + } + + @Test + public void testOauth2buildAuthorizationUrl() { + } + + @Test + public void testMiniappJscode2Session() { + } + + @Test + public void testGetTemplateDraftList() { + } + + @Test + public void testGetTemplateList() { + } + + @Test + public void testAddToTemplate() { + } + + @Test + public void testDeleteTemplate() { + } + + @Test + public void testCreateOpenAccount() { + } + + @Test + public void testBindOpenAccount() { + } + + @Test + public void testUnbindOpenAccount() { + } + + @Test + public void testGetOpenAccount() { + } + + @Test + public void testFastRegisterWeapp() { + } + + @Test + public void testFastRegisterWeappSearch() { + } +} diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImplTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImplTest.java new file mode 100644 index 0000000000..e5a255be1d --- /dev/null +++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImplTest.java @@ -0,0 +1,218 @@ +package me.chanjar.weixin.open.api.impl; + +import org.testng.annotations.Test; + +/** + * @author Binary Wang + * @date 2020-06-06 + */ +public class WxOpenFastMaServiceImplTest { + + @Test + public void testInitHttp() { + } + + @Test + public void testGetRequestHttpClient() { + } + + @Test + public void testGetRequestHttpProxy() { + } + + @Test + public void testGetRequestType() { + } + + @Test + public void testDoGetAccessTokenRequest() { + } + + @Test + public void testGetRequestHttp() { + } + + @Test + public void testGetPaidUnionId() { + } + + @Test + public void testJsCode2SessionInfo() { + } + + @Test + public void testSetDynamicData() { + } + + @Test + public void testCheckSignature() { + } + + @Test + public void testGetAccessToken() { + } + + @Test + public void testTestGetAccessToken() { + } + + @Test + public void testGet() { + } + + @Test + public void testPost() { + } + + @Test + public void testTestPost() { + } + + @Test + public void testExecute() { + } + + @Test + public void testExtractAccessToken() { + } + + @Test + public void testGetWxMaConfig() { + } + + @Test + public void testSetWxMaConfig() { + } + + @Test + public void testSetRetrySleepMillis() { + } + + @Test + public void testSetMaxRetryTimes() { + } + + @Test + public void testGetMsgService() { + } + + @Test + public void testGetMediaService() { + } + + @Test + public void testGetUserService() { + } + + @Test + public void testGetQrcodeService() { + } + + @Test + public void testGetTemplateService() { + } + + @Test + public void testGetSubscribeService() { + } + + @Test + public void testGetAnalysisService() { + } + + @Test + public void testGetCodeService() { + } + + @Test + public void testGetJsapiService() { + } + + @Test + public void testGetSettingService() { + } + + @Test + public void testGetShareService() { + } + + @Test + public void testGetRunService() { + } + + @Test + public void testGetSecCheckService() { + } + + @Test + public void testGetPluginService() { + } + + @Test + public void testGetExpressService() { + } + + @Test + public void testGetCloudService() { + } + + @Test + public void testGetLiveService() { + } + + @Test + public void testTestGetWxMaConfig() { + } + + @Test + public void testTestGetAccessToken1() { + } + + @Test + public void testGetAccountBasicInfo() { + } + + @Test + public void testSetNickname() { + } + + @Test + public void testQuerySetNicknameStatus() { + } + + @Test + public void testCheckWxVerifyNickname() { + } + + @Test + public void testModifyHeadImage() { + } + + @Test + public void testModifySignature() { + } + + @Test + public void testComponentRebindAdmin() { + } + + @Test + public void testGetAllCategories() { + } + + @Test + public void testAddCategory() { + } + + @Test + public void testDeleteCategory() { + } + + @Test + public void testGetCategory() { + } + + @Test + public void testModifyCategory() { + } +} diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImplTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImplTest.java new file mode 100644 index 0000000000..5e5f3e6682 --- /dev/null +++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImplTest.java @@ -0,0 +1,334 @@ +package me.chanjar.weixin.open.api.impl; + +import org.testng.annotations.Test; + +/** + * @author Binary Wang + * @date 2020-06-06 + */ +public class WxOpenMaServiceImplTest { + + @Test + public void testInitHttp() { + } + + @Test + public void testGetRequestHttpClient() { + } + + @Test + public void testGetRequestHttpProxy() { + } + + @Test + public void testGetRequestType() { + } + + @Test + public void testDoGetAccessTokenRequest() { + } + + @Test + public void testGetRequestHttp() { + } + + @Test + public void testGetPaidUnionId() { + } + + @Test + public void testJsCode2SessionInfo() { + } + + @Test + public void testSetDynamicData() { + } + + @Test + public void testCheckSignature() { + } + + @Test + public void testGetAccessToken() { + } + + @Test + public void testTestGetAccessToken() { + } + + @Test + public void testGet() { + } + + @Test + public void testPost() { + } + + @Test + public void testTestPost() { + } + + @Test + public void testExecute() { + } + + @Test + public void testExtractAccessToken() { + } + + @Test + public void testGetWxMaConfig() { + } + + @Test + public void testSetWxMaConfig() { + } + + @Test + public void testSetRetrySleepMillis() { + } + + @Test + public void testSetMaxRetryTimes() { + } + + @Test + public void testGetMsgService() { + } + + @Test + public void testGetMediaService() { + } + + @Test + public void testGetUserService() { + } + + @Test + public void testGetQrcodeService() { + } + + @Test + public void testGetTemplateService() { + } + + @Test + public void testGetSubscribeService() { + } + + @Test + public void testGetAnalysisService() { + } + + @Test + public void testGetCodeService() { + } + + @Test + public void testGetJsapiService() { + } + + @Test + public void testGetSettingService() { + } + + @Test + public void testGetShareService() { + } + + @Test + public void testGetRunService() { + } + + @Test + public void testGetSecCheckService() { + } + + @Test + public void testGetPluginService() { + } + + @Test + public void testGetExpressService() { + } + + @Test + public void testGetCloudService() { + } + + @Test + public void testGetLiveService() { + } + + @Test + public void testTestJsCode2SessionInfo() { + } + + @Test + public void testTestGetWxMaConfig() { + } + + @Test + public void testTestGetAccessToken1() { + } + + @Test + public void testGetDomain() { + } + + @Test + public void testModifyDomain() { + } + + @Test + public void testGetWebViewDomain() { + } + + @Test + public void testGetWebViewDomainInfo() { + } + + @Test + public void testSetWebViewDomain() { + } + + @Test + public void testSetWebViewDomainInfo() { + } + + @Test + public void testGetAccountBasicInfo() { + } + + @Test + public void testBindTester() { + } + + @Test + public void testUnbindTester() { + } + + @Test + public void testUnbindTesterByUserStr() { + } + + @Test + public void testGetTesterList() { + } + + @Test + public void testChangeWxaSearchStatus() { + } + + @Test + public void testGetWxaSearchStatus() { + } + + @Test + public void testGetShowWxaItem() { + } + + @Test + public void testUpdateShowWxaItem() { + } + + @Test + public void testCodeCommit() { + } + + @Test + public void testGetTestQrcode() { + } + + @Test + public void testGetCategoryList() { + } + + @Test + public void testGetPageList() { + } + + @Test + public void testSubmitAudit() { + } + + @Test + public void testGetAuditStatus() { + } + + @Test + public void testGetLatestAuditStatus() { + } + + @Test + public void testReleaseAudited() { + } + + @Test + public void testChangeVisitStatus() { + } + + @Test + public void testRevertCodeRelease() { + } + + @Test + public void testUndoCodeAudit() { + } + + @Test + public void testGetSupportVersion() { + } + + @Test + public void testGetSupportVersionInfo() { + } + + @Test + public void testSetSupportVersion() { + } + + @Test + public void testSetSupportVersionInfo() { + } + + @Test + public void testGrayRelease() { + } + + @Test + public void testRevertGrayRelease() { + } + + @Test + public void testGetGrayReleasePlan() { + } + + @Test + public void testQueryQuota() { + } + + @Test + public void testSpeedAudit() { + } + + @Test + public void testAddQrcodeJump() { + } + + @Test + public void testGetQrcodeJump() { + } + + @Test + public void testDownloadQrcodeJump() { + } + + @Test + public void testDeleteQrcodeJump() { + } + + @Test + public void testPublishQrcodeJump() { + } +} From ddbeda45846e531c0bd6a1b1c54ccd33ac3b2ff4 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 6 Jun 2020 21:17:30 +0800 Subject: [PATCH 18/90] =?UTF-8?q?:art:=20=E9=87=8D=E6=9E=84=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E9=83=A8=E5=88=86=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/common/bean/WxNetCheckResult.java | 1 - .../common/bean/WxNetCheckResultTest.java | 58 +++++++++++++++++++ .../mp/api/impl/BaseWxMpServiceImplTest.java | 53 ++--------------- 3 files changed, 64 insertions(+), 48 deletions(-) create mode 100644 weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxNetCheckResultTest.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxNetCheckResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxNetCheckResult.java index 2df2417f57..b5f5762cb3 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxNetCheckResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxNetCheckResult.java @@ -13,7 +13,6 @@ */ @Data public class WxNetCheckResult implements Serializable { - private static final long serialVersionUID = 6918924418847404172L; private List dnsInfos = new ArrayList<>(); diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxNetCheckResultTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxNetCheckResultTest.java new file mode 100644 index 0000000000..3f08b20bff --- /dev/null +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxNetCheckResultTest.java @@ -0,0 +1,58 @@ +package me.chanjar.weixin.common.bean; + +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * + * @author Binary Wang + * @date 2020-06-06 + */ +public class WxNetCheckResultTest { + + @Test + public void testFromJson() { + String json = "{\n" + + " \"dns\": [\n" + + " {\n" + + " \"ip\": \"111.161.64.40\", \n" + + " \"real_operator\": \"UNICOM\"\n" + + " }, \n" + + " {\n" + + " \"ip\": \"111.161.64.48\", \n" + + " \"real_operator\": \"UNICOM\"\n" + + " }\n" + + " ], \n" + + " \"ping\": [\n" + + " {\n" + + " \"ip\": \"111.161.64.40\", \n" + + " \"from_operator\": \"UNICOM\"," + + " \"package_loss\": \"0%\", \n" + + " \"time\": \"23.079ms\"\n" + + " }, \n" + + " {\n" + + " \"ip\": \"111.161.64.48\", \n" + + " \"from_operator\": \"UNICOM\", \n" + + " \"package_loss\": \"0%\", \n" + + " \"time\": \"21.434ms\"\n" + + " }\n" + + " ]\n" + + "}"; + WxNetCheckResult result = WxNetCheckResult.fromJson(json); + Assert.assertNotNull(result); + Assert.assertNotNull(result.getDnsInfos()); + + WxNetCheckResult.WxNetCheckDnsInfo dnsInfo = new WxNetCheckResult.WxNetCheckDnsInfo(); + dnsInfo.setIp("111.161.64.40"); + dnsInfo.setRealOperator("UNICOM"); + Assert.assertEquals(result.getDnsInfos().get(0), dnsInfo); + + WxNetCheckResult.WxNetCheckPingInfo pingInfo = new WxNetCheckResult.WxNetCheckPingInfo(); + pingInfo.setTime("21.434ms"); + pingInfo.setFromOperator("UNICOM"); + pingInfo.setIp("111.161.64.48"); + pingInfo.setPackageLoss("0%"); + Assert.assertEquals(result.getPingInfos().get(1), pingInfo); + + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java index 77aaf56a1d..b20d3fe142 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java @@ -7,6 +7,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.WxNetCheckResult; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; @@ -57,52 +58,6 @@ public void testNetCheck() throws WxErrorException { } - @Test - public void testNectCheckResult() { - String json = "{\n" + - " \"dns\": [\n" + - " {\n" + - " \"ip\": \"111.161.64.40\", \n" + - " \"real_operator\": \"UNICOM\"\n" + - " }, \n" + - " {\n" + - " \"ip\": \"111.161.64.48\", \n" + - " \"real_operator\": \"UNICOM\"\n" + - " }\n" + - " ], \n" + - " \"ping\": [\n" + - " {\n" + - " \"ip\": \"111.161.64.40\", \n" + - " \"from_operator\": \"UNICOM\"," + - " \"package_loss\": \"0%\", \n" + - " \"time\": \"23.079ms\"\n" + - " }, \n" + - " {\n" + - " \"ip\": \"111.161.64.48\", \n" + - " \"from_operator\": \"UNICOM\", \n" + - " \"package_loss\": \"0%\", \n" + - " \"time\": \"21.434ms\"\n" + - " }\n" + - " ]\n" + - "}"; - WxNetCheckResult result = WxNetCheckResult.fromJson(json); - Assert.assertNotNull(result); - Assert.assertNotNull(result.getDnsInfos()); - - WxNetCheckResult.WxNetCheckDnsInfo dnsInfo = new WxNetCheckResult.WxNetCheckDnsInfo(); - dnsInfo.setIp("111.161.64.40"); - dnsInfo.setRealOperator("UNICOM"); - Assert.assertEquals(result.getDnsInfos().get(0), dnsInfo); - - WxNetCheckResult.WxNetCheckPingInfo pingInfo = new WxNetCheckResult.WxNetCheckPingInfo(); - pingInfo.setTime("21.434ms"); - pingInfo.setFromOperator("UNICOM"); - pingInfo.setIp("111.161.64.48"); - pingInfo.setPackageLoss("0%"); - Assert.assertEquals(result.getPingInfos().get(1), pingInfo); - - } - @Test public void testGetCallbackIP() throws WxErrorException { String[] ipArray = this.wxService.getCallbackIP(); @@ -174,7 +129,11 @@ public void testTestGetJsapiTicket() { } @Test - public void testCreateJsapiSignature() { + public void testCreateJsapiSignature() throws WxErrorException { + final WxJsapiSignature jsapiSignature = this.wxService.createJsapiSignature("http://www.baidu.com"); + assertThat(jsapiSignature).isNotNull(); + assertThat(jsapiSignature.getSignature()).isNotNull(); + System.out.println(jsapiSignature); } @Test From a2f5452b4aeb8938c16c9f8b01b0f47c865e1b75 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 7 Jun 2020 16:21:00 +0800 Subject: [PATCH 19/90] =?UTF-8?q?:art:=20=E8=A7=84=E8=8C=83=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=A2=9E=E5=8A=A0javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../open/api/WxOpenComponentService.java | 254 ++++++++++++++++-- .../weixin/open/api/WxOpenConfigStorage.java | 185 ++++++++++++- .../weixin/open/api/WxOpenService.java | 27 ++ 3 files changed, 438 insertions(+), 28 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 98ff8e038c..4e0a2bccf5 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 @@ -18,21 +18,51 @@ * @author 007 */ 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"; + /** + * The constant API_CREATE_PREAUTHCODE_URL. + */ String API_CREATE_PREAUTHCODE_URL = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode"; + /** + * The constant API_QUERY_AUTH_URL. + */ String API_QUERY_AUTH_URL = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth"; + /** + * The constant API_AUTHORIZER_TOKEN_URL. + */ String API_AUTHORIZER_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token"; + /** + * The constant API_GET_AUTHORIZER_INFO_URL. + */ String API_GET_AUTHORIZER_INFO_URL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info"; + /** + * The constant API_GET_AUTHORIZER_OPTION_URL. + */ String API_GET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option"; + /** + * The constant API_SET_AUTHORIZER_OPTION_URL. + */ String API_SET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option"; + /** + * The constant API_GET_AUTHORIZER_LIST. + */ String API_GET_AUTHORIZER_LIST = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list"; + /** + * The constant COMPONENT_LOGIN_PAGE_URL. + */ String COMPONENT_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=xxx&biz_appid=xxx"; /** * 手机端打开授权链接. */ String COMPONENT_MOBILE_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&no_scan=1&auth_type=3&component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=xxx&biz_appid=xxx#wechat_redirect"; + /** + * The constant CONNECT_OAUTH2_AUTHORIZE_URL. + */ String CONNECT_OAUTH2_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s&component_appid=%s#wechat_redirect"; /** @@ -44,29 +74,72 @@ public interface WxOpenComponentService { */ String OAUTH2_REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/component/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s&component_appid=%s"; + /** + * The constant MINIAPP_JSCODE_2_SESSION. + */ String MINIAPP_JSCODE_2_SESSION = "https://api.weixin.qq.com/sns/component/jscode2session?appid=%s&js_code=%s&grant_type=authorization_code&component_appid=%s"; + /** + * The constant CREATE_OPEN_URL. + */ String CREATE_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/create"; + /** + * The constant BIND_OPEN_URL. + */ String BIND_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/bind"; + /** + * The constant UNBIND_OPEN_URL. + */ String UNBIND_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/unbind"; + /** + * The constant GET_OPEN_URL. + */ String GET_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/get"; /** * 快速创建小程序接口. */ String FAST_REGISTER_WEAPP_URL = "https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp?action=create"; + /** + * The constant FAST_REGISTER_WEAPP_SEARCH_URL. + */ String FAST_REGISTER_WEAPP_SEARCH_URL = "https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp?action=search"; + /** + * 代小程序实现业务. + * 小程序代码模版库管理:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1506504150_nMMh6&token=&lang=zh_CN + * access_token 为 component_access_token + */ + String GET_TEMPLATE_DRAFT_LIST_URL = "https://api.weixin.qq.com/wxa/gettemplatedraftlist"; + /** + * The constant GET_TEMPLATE_LIST_URL. + */ + String GET_TEMPLATE_LIST_URL = "https://api.weixin.qq.com/wxa/gettemplatelist"; + /** + * The constant ADD_TO_TEMPLATE_URL. + */ + String ADD_TO_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/addtotemplate"; + /** + * The constant DELETE_TEMPLATE_URL. + */ + String DELETE_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/deletetemplate"; + + /** + * Gets wx mp service by appid. + * + * @param appid the appid + * @return the wx mp service by appid + */ WxMpService getWxMpServiceByAppid(String appid); /** * 获取指定appid的开放平台小程序服务(继承一般小程序服务能力). * * @param appid . - * @return . + * @return . wx ma service by appid */ WxOpenMaService getWxMaServiceByAppid(String appid); @@ -74,35 +147,93 @@ public interface WxOpenComponentService { * 获取指定appid的快速创建的小程序服务. * * @param appid . - * @return . + * @return . wx fast ma service by appid */ WxOpenFastMaService getWxFastMaServiceByAppid(String appid); + /** + * Gets wx open config storage. + * + * @return the wx open config storage + */ WxOpenConfigStorage getWxOpenConfigStorage(); + /** + * Check signature boolean. + * + * @param timestamp the timestamp + * @param nonce the nonce + * @param signature the signature + * @return the boolean + */ boolean checkSignature(String timestamp, String nonce, String signature); + /** + * Gets component access token. + * + * @param forceRefresh the force refresh + * @return the component access token + * @throws WxErrorException the wx error exception + */ String getComponentAccessToken(boolean forceRefresh) throws WxErrorException; + /** + * Post string. + * + * @param uri the uri + * @param postData the post data + * @return the string + * @throws WxErrorException the wx error exception + */ String post(String uri, String postData) throws WxErrorException; + /** + * Post string. + * + * @param uri the uri + * @param postData the post data + * @param accessTokenKey the access token key + * @return the string + * @throws WxErrorException the wx error exception + */ String post(String uri, String postData, String accessTokenKey) throws WxErrorException; + /** + * Get string. + * + * @param uri the uri + * @return the string + * @throws WxErrorException the wx error exception + */ String get(String uri) throws WxErrorException; + /** + * Get string. + * + * @param uri the uri + * @param accessTokenKey the access token key + * @return the string + * @throws WxErrorException the wx error exception + */ String get(String uri, String accessTokenKey) throws WxErrorException; /** * 获取用户授权页URL(来路URL和成功跳转URL 的域名都需要为三方平台设置的 登录授权的发起页域名). + * + * @param redirectUri the redirect uri + * @return the pre auth url + * @throws WxErrorException the wx error exception */ String getPreAuthUrl(String redirectUri) throws WxErrorException; /** * . * - * @param authType 要授权的帐号类型:1则商户点击链接后,手机端仅展示公众号、2表示仅展示小程序,3表示公众号和小程序都展示。如果为未指定,则默认小程序和公众号都展示。第三方平台开发者可以使用本字段来控制授权的帐号类型。 - * @param bizAppid 指定授权唯一的小程序或公众号 - * 注:authType、bizAppid 互斥。 + * @param redirectUri the redirect uri + * @param authType 要授权的帐号类型:1则商户点击链接后,手机端仅展示公众号、2表示仅展示小程序,3表示公众号和小程序都展示。如果为未指定,则默认小程序和公众号都展示。第三方平台开发者可以使用本字段来控制授权的帐号类型。 + * @param bizAppid 指定授权唯一的小程序或公众号 注:authType、bizAppid 互斥。 + * @return the pre auth url + * @throws WxErrorException the wx error exception */ String getPreAuthUrl(String redirectUri, String authType, String bizAppid) throws WxErrorException; @@ -110,7 +241,7 @@ public interface WxOpenComponentService { * 获取预授权链接(手机端预授权). * * @param redirectUri . - * @return . + * @return . mobile pre auth url * @throws WxErrorException . */ String getMobilePreAuthUrl(String redirectUri) throws WxErrorException; @@ -121,64 +252,134 @@ public interface WxOpenComponentService { * @param redirectUri . * @param authType . * @param bizAppid . - * @return . + * @return . mobile pre auth url * @throws WxErrorException . */ String getMobilePreAuthUrl(String redirectUri, String authType, String bizAppid) throws WxErrorException; + /** + * Route string. + * + * @param wxMessage the wx message + * @return the string + * @throws WxErrorException the wx error exception + */ String route(WxOpenXmlMessage wxMessage) throws WxErrorException; /** * 使用授权码换取公众号或小程序的接口调用凭据和授权信息. + * + * @param authorizationCode the authorization code + * @return the query auth + * @throws WxErrorException the wx error exception */ WxOpenQueryAuthResult getQueryAuth(String authorizationCode) throws WxErrorException; /** * 获取授权方的帐号基本信息. + * + * @param authorizerAppid the authorizer appid + * @return the authorizer info + * @throws WxErrorException the wx error exception */ WxOpenAuthorizerInfoResult getAuthorizerInfo(String authorizerAppid) throws WxErrorException; /** * 获取授权方的选项设置信息. + * + * @param authorizerAppid the authorizer appid + * @param optionName the option name + * @return the authorizer option + * @throws WxErrorException the wx error exception */ WxOpenAuthorizerOptionResult getAuthorizerOption(String authorizerAppid, String optionName) throws WxErrorException; /** * 获取所有授权方列表. + * + * @param begin the begin + * @param len the len + * @return the authorizer list + * @throws WxErrorException the wx error exception */ WxOpenAuthorizerListResult getAuthorizerList(int begin, int len) throws WxErrorException; /** * 设置授权方的选项信息. + * + * @param authorizerAppid the authorizer appid + * @param optionName the option name + * @param optionValue the option value + * @throws WxErrorException the wx error exception */ void setAuthorizerOption(String authorizerAppid, String optionName, String optionValue) throws WxErrorException; + /** + * Gets authorizer access token. + * + * @param appid the appid + * @param forceRefresh the force refresh + * @return the authorizer access token + * @throws WxErrorException the wx error exception + */ String getAuthorizerAccessToken(String appid, boolean forceRefresh) throws WxErrorException; + /** + * Oauth 2 get access token wx mp o auth 2 access token. + * + * @param appid the appid + * @param code the code + * @return the wx mp o auth 2 access token + * @throws WxErrorException the wx error exception + */ WxMpOAuth2AccessToken oauth2getAccessToken(String appid, String code) throws WxErrorException; + /** + * Check signature boolean. + * + * @param appId the app id + * @param timestamp the timestamp + * @param nonce the nonce + * @param signature the signature + * @return the boolean + */ boolean checkSignature(String appId, String timestamp, String nonce, String signature); + /** + * Oauth 2 refresh access token wx mp o auth 2 access token. + * + * @param appid the appid + * @param refreshToken the refresh token + * @return the wx mp o auth 2 access token + * @throws WxErrorException the wx error exception + */ WxMpOAuth2AccessToken oauth2refreshAccessToken(String appid, String refreshToken) throws WxErrorException; + /** + * Oauth 2 build authorization url string. + * + * @param appid the appid + * @param redirectUri the redirect uri + * @param scope the scope + * @param state the state + * @return the string + */ String oauth2buildAuthorizationUrl(String appid, String redirectUri, String scope, String state); - WxMaJscode2SessionResult miniappJscode2Session(String appId, String jsCode) throws WxErrorException; - /** - * 代小程序实现业务. - * 小程序代码模版库管理:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1506504150_nMMh6&token=&lang=zh_CN - * access_token 为 component_access_token + * Miniapp jscode 2 session wx ma jscode 2 session result. + * + * @param appId the app id + * @param jsCode the js code + * @return the wx ma jscode 2 session result + * @throws WxErrorException the wx error exception */ - String GET_TEMPLATE_DRAFT_LIST_URL = "https://api.weixin.qq.com/wxa/gettemplatedraftlist"; - String GET_TEMPLATE_LIST_URL = "https://api.weixin.qq.com/wxa/gettemplatelist"; - String ADD_TO_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/addtotemplate"; - String DELETE_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/deletetemplate"; + WxMaJscode2SessionResult miniappJscode2Session(String appId, String jsCode) throws WxErrorException; /** * 获取草稿箱内的所有临时代码草稿. * - * @return 草稿箱代码模板列表(draftId) + * @return 草稿箱代码模板列表 (draftId) * @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档 */ List getTemplateDraftList() throws WxErrorException; @@ -186,7 +387,7 @@ public interface WxOpenComponentService { /** * 获取代码模版库中的所有小程序代码模版. * - * @return 小程序代码模版列表(templateId) + * @return 小程序代码模版列表 (templateId) * @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档 */ List getTemplateList() throws WxErrorException; @@ -196,7 +397,7 @@ public interface WxOpenComponentService { * * @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得 * @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档 - * @see #getTemplateDraftList + * @see #getTemplateDraftList #getTemplateDraftList */ void addToTemplate(long draftId) throws WxErrorException; @@ -205,7 +406,7 @@ public interface WxOpenComponentService { * * @param templateId 要删除的模版ID * @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档 - * @see #getTemplateList + * @see #getTemplateList #getTemplateList */ void deleteTemplate(long templateId) throws WxErrorException; @@ -215,38 +416,40 @@ public interface WxOpenComponentService { * https://api.weixin.qq.com/cgi-bin/open/create * * @param appId 公众号/小程序的appId - * @return . + * @return . wx open create result * @throws WxErrorException . */ WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException; - /** * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/bind.html * 将公众号/小程序绑定到开放平台帐号下 * * @param appId 公众号/小程序的appId * @param openAppid 开放平台帐号 appid,由创建开发平台帐号接口返回 + * @return the boolean + * @throws WxErrorException the wx error exception */ Boolean bindOpenAccount(String appId, String openAppid) throws WxErrorException; - /** * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/unbind.html * 将公众号/小程序从开放平台帐号下解绑 * * @param appId 公众号/小程序的appId * @param openAppid 开放平台帐号 appid,由创建开发平台帐号接口返回 + * @return the boolean + * @throws WxErrorException the wx error exception */ Boolean unbindOpenAccount(String appId, String openAppid) throws WxErrorException; - /** * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/get.html * 获取公众号/小程序所绑定的开放平台帐号 * * @param appId 公众号/小程序的appId * @return 开放平台帐号 appid,由创建开发平台帐号接口返回 + * @throws WxErrorException the wx error exception */ WxOpenGetResult getOpenAccount(String appId) throws WxErrorException; @@ -261,7 +464,7 @@ public interface WxOpenComponentService { * @param legalPersonaWechat 法人微信号 * @param legalPersonaName 法人姓名(绑定银行卡) * @param componentPhone 第三方联系电话(方便法人与第三方联系) - * @return . + * @return . wx open result * @throws WxErrorException . */ WxOpenResult fastRegisterWeapp(String name, String code, String codeType, String legalPersonaWechat, String legalPersonaName, String componentPhone) throws WxErrorException; @@ -276,6 +479,7 @@ public interface WxOpenComponentService { * @param name 企业名(需与工商部门登记信息一致) * @param legalPersonaWechat 法人微信号 * @param legalPersonaName 法人姓名(绑定银行卡) + * @return the wx open result * @throws WxErrorException . */ WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException; diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java index 5a51c3bfa1..4d1c2b136d 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java @@ -9,54 +9,172 @@ import java.util.concurrent.locks.Lock; /** + * The interface Wx open config storage. + * * @author 007 */ public interface WxOpenConfigStorage { + /** + * Gets component app id. + * + * @return the component app id + */ String getComponentAppId(); + /** + * Sets component app id. + * + * @param componentAppId the component app id + */ void setComponentAppId(String componentAppId); + /** + * Gets component app secret. + * + * @return the component app secret + */ String getComponentAppSecret(); + /** + * Sets component app secret. + * + * @param componentAppSecret the component app secret + */ void setComponentAppSecret(String componentAppSecret); + /** + * Gets component token. + * + * @return the component token + */ String getComponentToken(); + /** + * Sets component token. + * + * @param componentToken the component token + */ void setComponentToken(String componentToken); + /** + * Gets component aes key. + * + * @return the component aes key + */ String getComponentAesKey(); + /** + * Sets component aes key. + * + * @param componentAesKey the component aes key + */ void setComponentAesKey(String componentAesKey); + /** + * Gets component verify ticket. + * + * @return the component verify ticket + */ String getComponentVerifyTicket(); + /** + * Sets component verify ticket. + * + * @param componentVerifyTicket the component verify ticket + */ void setComponentVerifyTicket(String componentVerifyTicket); + /** + * Gets component access token. + * + * @return the component access token + */ String getComponentAccessToken(); + /** + * Is component access token expired boolean. + * + * @return the boolean + */ boolean isComponentAccessTokenExpired(); + /** + * Expire component access token. + */ void expireComponentAccessToken(); + /** + * Update component access token. + * + * @param componentAccessToken the component access token + */ void updateComponentAccessToken(WxOpenComponentAccessToken componentAccessToken); + /** + * Gets http proxy host. + * + * @return the http proxy host + */ String getHttpProxyHost(); + /** + * Gets http proxy port. + * + * @return the http proxy port + */ int getHttpProxyPort(); + /** + * Gets http proxy username. + * + * @return the http proxy username + */ String getHttpProxyUsername(); + /** + * Gets http proxy password. + * + * @return the http proxy password + */ String getHttpProxyPassword(); + /** + * Gets apache http client builder. + * + * @return the apache http client builder + */ ApacheHttpClientBuilder getApacheHttpClientBuilder(); + /** + * Gets wx mp config storage. + * + * @param appId the app id + * @return the wx mp config storage + */ WxMpConfigStorage getWxMpConfigStorage(String appId); + /** + * Gets wx ma config. + * + * @param appId the app id + * @return the wx ma config + */ WxMaConfig getWxMaConfig(String appId); + /** + * Gets component access token lock. + * + * @return the component access token lock + */ Lock getComponentAccessTokenLock(); + /** + * Gets lock by key. + * + * @param key the key + * @return the lock by key + */ Lock getLockByKey(String key); /** @@ -69,25 +187,54 @@ public interface WxOpenConfigStorage { /** * 是否自动刷新token + * + * @return the boolean */ boolean autoRefreshToken(); + /** + * Gets authorizer refresh token. + * + * @param appId the app id + * @return the authorizer refresh token + */ String getAuthorizerRefreshToken(String appId); + /** + * Sets authorizer refresh token. + * + * @param appId the app id + * @param authorizerRefreshToken the authorizer refresh token + */ void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken); + /** + * Gets authorizer access token. + * + * @param appId the app id + * @return the authorizer access token + */ String getAuthorizerAccessToken(String appId); + /** + * Is authorizer access token expired boolean. + * + * @param appId the app id + * @return the boolean + */ boolean isAuthorizerAccessTokenExpired(String appId); /** * 强制将access token过期掉 + * + * @param appId the app id */ void expireAuthorizerAccessToken(String appId); /** * 应该是线程安全的 * + * @param appId the app id * @param authorizerAccessToken 要更新的WxAccessToken对象 */ void updateAuthorizerAccessToken(String appId, WxOpenAuthorizerAccessToken authorizerAccessToken); @@ -95,41 +242,72 @@ public interface WxOpenConfigStorage { /** * 应该是线程安全的 * + * @param appId the app id * @param authorizerAccessToken 新的accessToken值 * @param expiresInSeconds 过期时间,以秒为单位 */ void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds); + /** + * Gets jsapi ticket. + * + * @param appId the app id + * @return the jsapi ticket + */ String getJsapiTicket(String appId); + /** + * Is jsapi ticket expired boolean. + * + * @param appId the app id + * @return the boolean + */ boolean isJsapiTicketExpired(String appId); /** * 强制将jsapi ticket过期掉 + * + * @param appId the app id */ void expireJsapiTicket(String appId); /** * 应该是线程安全的 * + * @param appId the app id * @param jsapiTicket 新的jsapi ticket值 * @param expiresInSeconds 过期时间,以秒为单位 */ void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds); + /** + * Gets card api ticket. + * + * @param appId the app id + * @return the card api ticket + */ String getCardApiTicket(String appId); + /** + * Is card api ticket expired boolean. + * + * @param appId the app id + * @return the boolean + */ boolean isCardApiTicketExpired(String appId); /** * 强制将卡券api ticket过期掉 + * + * @param appId the app id */ void expireCardApiTicket(String appId); /** * 应该是线程安全的 * + * @param appId the app id * @param cardApiTicket 新的cardApi ticket值 * @param expiresInSeconds 过期时间,以秒为单位 */ @@ -137,10 +315,11 @@ public interface WxOpenConfigStorage { /** * 设置第三方平台基础信息 - * @param componentAppId 第三方平台 appid + * + * @param componentAppId 第三方平台 appid * @param componentAppSecret 第三方平台 appsecret - * @param componentToken 消息校验Token - * @param componentAesKey 消息加解密Key + * @param componentToken 消息校验Token + * @param componentAesKey 消息加解密Key */ void setWxOpenInfo(String componentAppId, String componentAppSecret, String componentToken, String componentAesKey); } 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 a157581b36..c2d00877aa 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 @@ -3,22 +3,49 @@ import me.chanjar.weixin.common.error.WxErrorException; /** + * The interface Wx open service. + * * @author 007 */ public interface WxOpenService { + /** + * Gets wx open component service. + * + * @return the wx open component service + */ WxOpenComponentService getWxOpenComponentService(); + /** + * Gets wx open config storage. + * + * @return the wx open config storage + */ WxOpenConfigStorage getWxOpenConfigStorage(); + /** + * Sets wx open config storage. + * + * @param wxOpenConfigStorage the wx open config storage + */ void setWxOpenConfigStorage(WxOpenConfigStorage wxOpenConfigStorage); /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求 + * + * @param url the url + * @param queryParam the query param + * @return the string + * @throws WxErrorException the wx error exception */ String get(String url, String queryParam) throws WxErrorException; /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求 + * + * @param url the url + * @param postData the post data + * @return the string + * @throws WxErrorException the wx error exception */ String post(String url, String postData) throws WxErrorException; From 92c0fd698b7c900caba60e8d8b444b9a9a90a48e Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 7 Jun 2020 17:59:34 +0800 Subject: [PATCH 20/90] =?UTF-8?q?:new:=20#1529=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E9=80=80=E6=AC=BE=E5=A2=9E=E5=8A=A0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=8D=95=E5=93=81=E9=80=80=E6=AC=BE=E5=92=8C=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E6=9F=A5=E8=AF=A2=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bean/request/WxPayRefundQueryRequest.java | 3 +- .../bean/request/WxPayRefundRequest.java | 55 +++++++- .../result/WxPayRefundPromotionDetail.java | 117 ++++++++++++++++++ .../bean/result/WxPayRefundQueryResult.java | 33 +++++ .../wxpay/bean/result/WxPayRefundResult.java | 38 +++++- .../wxpay/service/WxPayService.java | 50 ++++++++ .../service/impl/BaseWxPayServiceImpl.java | 28 +++++ .../bean/request/WxPayRefundRequestTest.java | 47 +++++++ .../bean/result/WxPayRefundResultTest.java | 44 ++++++- .../impl/BaseWxPayServiceImplTest.java | 18 +++ 10 files changed, 426 insertions(+), 7 deletions(-) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundPromotionDetail.java create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequestTest.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryRequest.java index d9befee6f6..875a702b26 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryRequest.java @@ -89,9 +89,8 @@ protected void checkConstraints() throws WxPayException { && StringUtils.isBlank(outRefundNo) && StringUtils.isBlank(refundId)) || (StringUtils.isNotBlank(transactionId) && StringUtils.isNotBlank(outTradeNo) && StringUtils.isNotBlank(outRefundNo) && StringUtils.isNotBlank(refundId))) { - throw new WxPayException("transaction_id,out_trade_no,out_refund_no,refund_id 必须四选一"); + throw new WxPayException("transactionId,outRefundNo,transactionId,refundId 必须四选一"); } - } @Override diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequest.java index 924d46ffdd..e145644d91 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequest.java @@ -4,8 +4,11 @@ import com.github.binarywang.wxpay.constant.WxPayConstants.RefundAccountSource; import com.github.binarywang.wxpay.exception.WxPayException; import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamConverter; import lombok.*; +import lombok.experimental.Accessors; import me.chanjar.weixin.common.annotation.Required; +import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; @@ -26,7 +29,10 @@ @NoArgsConstructor @AllArgsConstructor @XStreamAlias("xml") +@Accessors(chain = true) public class WxPayRefundRequest extends BaseWxPayRequest { + private static final long serialVersionUID = 522565152886671848L; + private static final String[] REFUND_ACCOUNT = new String[]{ RefundAccountSource.RECHARGE_FUNDS, RefundAccountSource.UNSETTLED_FUNDS}; @@ -127,7 +133,6 @@ public class WxPayRefundRequest extends BaseWxPayRequest { * 描述:操作员帐号, 默认为商户号 * */ - //@Required @XStreamAlias("op_user_id") private String opUserId; /** @@ -172,6 +177,54 @@ public class WxPayRefundRequest extends BaseWxPayRequest { @XStreamAlias("notify_url") private String notifyUrl; + /** + *
+   * 字段名:商品详情
+   * 变量名:detail
+   * 类型:否
+   * 示例值:String(6000)
+   * 退款包含的商品列表信息detail字段列表说明:
+   *
+   * 字段名	变量名	必填	类型	示例值	描述
+   * 商品列表	goods_detail	是	String	示例见下文	商品信息,使用Json数组格式提交
+   * 商品列表goods_detail字段列表说明:
+   *
+   * 字段名	变量名	必填	类型	示例值	描述
+   * 商品编码	goods_id	是	String(32)	商品编码	由半角的大小写字母、数字、中划线、下划线中的一种或几种组成
+   * 微信侧商品编码	wxpay_goods_id	否	String(32)	1001	微信支付定义的统一商品编号(没有可不传)
+   * 商品名称	goods_name	否	String(256)	iPhone6s 16G	商品的实际名称
+   * 商品退款金额	refund_amount	是	int	528800	商品退款金额
+   * 商品退货数量	refund_quantity	是	int	1	单品的退款数量
+   * 商品单价	price	是	int	528800	单位为:分。如果商户有优惠,需传输商户优惠后的单价(例如:用户对一笔100元的订单使用了商场发的优惠券100-50,则活动商品的单价应为原单价-50)
+   * detail字段值举例如下:
+   *
+   * {
+   * "goods_detail": [
+   * {
+   * "goods_id": "商品编码",
+   * "wxpay_goods_id": "1001",
+   * "goods_name": "iPhone6s 16G",
+   * "refund_amount": 528800,
+   * "refund_quantity": 1,
+   * "price": 528800
+   * },
+   * {
+   * "goods_id": "商品编码",
+   * "wxpay_goods_id": "1001",
+   * "goods_name": "iPhone6s 16G",
+   * "refund_amount": 528800,
+   * "refund_quantity": 1,
+   * "price": 608800
+   * }
+   * ]
+   * }
+   * 描述:退款包含的商品列表信息,全额退款可不传,必须按照规范上传,JSON格式
+   * 
+ */ + @XStreamAlias("detail") + @XStreamConverter(value = XStreamCDataConverter.class) + private String detail; + @Override public void checkAndSign(WxPayConfig config) throws WxPayException { if (StringUtils.isBlank(this.getOpUserId())) { diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundPromotionDetail.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundPromotionDetail.java new file mode 100644 index 0000000000..414560b936 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundPromotionDetail.java @@ -0,0 +1,117 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 营销详情 . + * + * @author Binary Wang + * @date 2020-06-07 + */ +@Data +public class WxPayRefundPromotionDetail implements Serializable { + private static final long serialVersionUID = 2197712244944584263L; + + /** + * 字段名:券ID + * 变量名:promotion_id + * 是否必填:是 + * 类型:String(32) + * 示例例:109519 + * 描述:券或者立减优惠id + */ + @SerializedName("promotion_id") + private String promotionId; + /** + * 字段名:优惠范围 + * 变量名:scope + * 是否必填:是 + * 类型:String(32) + * 示例例:SINGLE + * 描述:GLOBAL- 全场代金券,SINGLE- 单品优惠 + */ + @SerializedName("scope") + private String scope; + /** + * 字段名:优惠类型 + * 变量名:type + * 是否必填:是 + * 类型:String(32) + * 示例例:DISCOUNT + * 描述:COUPON- 代金券,需要走结算资金的充值型代金券,(境外商户券币种与支付币种一致),DISCOUNT- 优惠券,不走结算资金的免充值型优惠券,(境外商户券币种与标价币种一致 + */ + @SerializedName("type") + private String type; + /** + * 字段名:代金券退款金额 + * 变量名:refund_amount + * 是否必填:是 + * 类型:Int + * 示例例:100 + * 描述:代金券退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠 + */ + @SerializedName("refund_amount") + private Integer refundAmount; + /** + * 字段名:商品列表 + * 变量名:goods_detail + * 是否必填:否 + * 类型:String + * 示例例:见下文 + * 描述:商品信息,使用Json格式 + */ + @SerializedName("goods_detail") + private List goodsDetails; + + @Data + public static class GoodDetail { + /** + * 字段名:商品编码 + * 变量名:goods_id + * 是否必填:是 + * 类型:String(32) + * 示例值:商品编码 + * 描述:由半角的大小写字母、数字、中划线、下划线中的一种或几种组成 + */ + @SerializedName("goods_id") + private String goodsId; + + /** + * 字段名:优惠退款金额 + * 变量名:refund_amount + * 是否必填:是 + * 类型:int + * 示例值:528800 + * 描述:优惠退款金额 + */ + @SerializedName("refund_amount") + private Integer refundAmount; + + /** + * 字段名:商品退货数量 + * 变量名:refund_quantity + * 是否必填:是 + * 类型:int + * 示例值:1 + * 描述:单品的退货数量 + */ + @SerializedName("refund_quantity") + private Integer refundQuantity; + + /** + * 字段名:商品单价 + * 变量名:price + * 是否必填:是 + * 类型:int + * 示例值:528800 + * 描述:单位为:分。如果商户有优惠,需传输商户优惠后的单价(例如:用户对一笔100元的订单使用了商场发的优惠券100-50,则活动商品的单价应为原单价-50) + */ + @SerializedName("price") + private Integer price; + + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java index 54fc8d4e1b..fe17e1477e 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java @@ -3,12 +3,17 @@ import java.util.List; import com.google.common.collect.Lists; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; import com.thoughtworks.xstream.annotations.XStreamAlias; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Document; /** @@ -130,6 +135,34 @@ public class WxPayRefundQueryResult extends BaseWxPayResult { private List refundRecords; + /** + * 营销详情. + */ + @XStreamAlias("promotion_detail") + private String promotionDetailString; + + private List promotionDetails; + + /** + * 组装生成营销详情信息. + */ + public void composePromotionDetails() { + if (StringUtils.isEmpty(this.promotionDetailString)) { + return; + } + + JsonElement tmpJsonElement = new JsonParser().parse(this.promotionDetailString); + + final List promotionDetail = WxGsonBuilder.create() + .fromJson(tmpJsonElement.getAsJsonObject().get("promotion_detail"), + new TypeToken>() { + }.getType() + ); + + this.setPromotionDetails(promotionDetail); + } + + /** * 组装生成退款记录属性的内容. */ diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java index fa971ffe14..8d21f7a0f3 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java @@ -1,15 +1,20 @@ package com.github.binarywang.wxpay.bean.result; -import java.io.Serializable; -import java.util.List; - import com.google.common.collect.Lists; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; import com.thoughtworks.xstream.annotations.XStreamAlias; import lombok.Data; import lombok.EqualsAndHashCode; 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; + /** *
  * 微信支付-申请退款返回结果.
@@ -115,8 +120,35 @@ public class WxPayRefundResult extends BaseWxPayResult implements Serializable {
   @XStreamAlias("coupon_refund_fee")
   private Integer couponRefundFee;
 
+  /**
+   * 营销详情.
+   */
+  @XStreamAlias("promotion_detail")
+  private String promotionDetailString;
+
+  private List promotionDetails;
+
   private List refundCoupons;
 
+  /**
+   * 组装生成营销详情信息.
+   */
+  public void composePromotionDetails() {
+    if (StringUtils.isEmpty(this.promotionDetailString)) {
+      return;
+    }
+
+    JsonElement tmpJsonElement = new JsonParser().parse(this.promotionDetailString);
+
+    final List promotionDetail = WxGsonBuilder.create()
+      .fromJson(tmpJsonElement.getAsJsonObject().get("promotion_detail"),
+        new TypeToken>() {
+        }.getType()
+      );
+
+    this.setPromotionDetails(promotionDetail);
+  }
+
   /**
    * 组装生成退款代金券信息.
    */
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 2c5ad12f70..b29f50129c 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
@@ -256,6 +256,33 @@ public interface WxPayService {
    */
   WxPayRefundResult refund(WxPayRefundRequest request) throws WxPayException;
 
+  /**
+   * 
+   * 申请退款API(支持单品).
+   * 详见 https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_103&index=3
+   *
+   * 应用场景
+   * 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。
+   *
+   * 注意:
+   * 1、交易时间超过一年的订单无法提交退款;
+   * 2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号。
+   * 3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次
+   *     错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次
+   * 4、每个支付订单的部分退款次数不能超过50次
+   * 5、本接口支持单品优惠订单全额退款和单品优惠订单部分退款,推荐使用本接口,如果使用不支持单品优惠部分退款的历史接口,请看https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=9_4
+   *
+   * 接口地址
+   * https://api.mch.weixin.qq.com/secapi/pay/refundv2
+   * https://api2.mch.weixin.qq.com/secapi/pay/refundv2(备用域名)见跨城冗灾方案
+   * 
+ * + * @param request 请求对象 + * @return 退款操作结果 wx pay refund result + * @throws WxPayException the wx pay exception + */ + WxPayRefundResult refundV2(WxPayRefundRequest request) throws WxPayException; + /** *
    * 微信支付-查询退款.
@@ -293,6 +320,29 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
    */
   WxPayRefundQueryResult refundQuery(WxPayRefundQueryRequest request) throws WxPayException;
 
+  /**
+   * 
+   * 微信支付-查询退款API(支持单品).
+   * 应用场景
+   *    提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。
+   * 注意:
+   * 1、本接口支持查询单品优惠相关退款信息,且仅支持按微信退款单号或商户退款单号查询,若继续调用老查询退款接口,
+   *    请见https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=9_5
+   * 2、请求频率限制:300qps,即每秒钟正常的退款查询请求次数不超过300次
+   * 3、错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款查询请求不超过6次
+   *
+   * 接口地址
+   * https://api.mch.weixin.qq.com/pay/refundqueryv2
+   * https://api2.mch.weixin.qq.com/pay/refundqueryv2(备用域名)见跨城冗灾方案
+   * 详见 https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_104&index=4
+   * 
+ * + * @param request 微信退款单号 + * @return 退款信息 wx pay refund query result + * @throws WxPayException the wx pay exception + */ + WxPayRefundQueryResult refundQueryV2(WxPayRefundQueryRequest request) throws WxPayException; + /** * 解析支付结果通知. * 详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7 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 81082a3aa6..909b78f257 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 @@ -128,6 +128,22 @@ public WxPayRefundResult refund(WxPayRefundRequest request) throws WxPayExceptio return result; } + @Override + public WxPayRefundResult refundV2(WxPayRefundRequest request) throws WxPayException { + request.checkAndSign(this.getConfig()); + + String url = this.getPayBaseUrl() + "/secapi/pay/refundv2"; + if (this.getConfig().isUseSandboxEnv()) { + url = this.getConfig().getPayBaseUrl() + "/sandboxnew/pay/refundv2"; + } + + String responseContent = this.post(url, request.toXML(), true); + WxPayRefundResult result = BaseWxPayResult.fromXML(responseContent, WxPayRefundResult.class); + result.composePromotionDetails(); + result.checkResult(this, request.getSignType(), true); + return result; + } + @Override public WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, String outRefundNo, String refundId) throws WxPayException { @@ -152,6 +168,18 @@ public WxPayRefundQueryResult refundQuery(WxPayRefundQueryRequest request) throw return result; } + @Override + public WxPayRefundQueryResult refundQueryV2(WxPayRefundQueryRequest request) throws WxPayException { + request.checkAndSign(this.getConfig()); + + String url = this.getPayBaseUrl() + "/pay/refundqueryv2"; + String responseContent = this.post(url, request.toXML(), false); + WxPayRefundQueryResult result = BaseWxPayResult.fromXML(responseContent, WxPayRefundQueryResult.class); + result.composePromotionDetails(); + result.checkResult(this, request.getSignType(), true); + return result; + } + @Override public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData) throws WxPayException { return this.parseOrderNotifyResult(xmlData, null); diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequestTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequestTest.java new file mode 100644 index 0000000000..1118edea87 --- /dev/null +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/request/WxPayRefundRequestTest.java @@ -0,0 +1,47 @@ +package com.github.binarywang.wxpay.bean.request; + +import org.testng.annotations.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Binary Wang + * @date 2020-06-07 + */ +public class WxPayRefundRequestTest { + + @Test + public void testToXML() { + WxPayRefundRequest refundRequest = new WxPayRefundRequest(); + refundRequest.setAppid("wx2421b1c4370ec43b"); + refundRequest.setMchId("10000100"); + refundRequest.setNonceStr("6cefdb308e1e2e8aabd48cf79e546a02"); + refundRequest.setNotifyUrl("https://weixin.qq.com/"); + refundRequest.setOutRefundNo("1415701182"); + refundRequest.setOutTradeNo("1415757673"); + refundRequest.setRefundFee(1); + refundRequest.setTotalFee(1); + refundRequest.setTransactionId(""); + refundRequest.setDetail("{\"goods_detail\":[{\"goods_id\":\"商品编码\",\"wxpay_goods_id\":\"1001\",\"goods_name\":\"iPhone6s\n" + + "16G\",\"refund_amount\":528800,\"refund_quantity\":1,\"price\":528800},{\"goods_id\":\"商品编码\",\"wxpay_goods_id\":\"1001\",\"goods_name\":\"iPhone6s\n" + + "16G\",\"refund_amount\"\":528800,\"refund_quantity\":1,\"price\":608800}]}"); + refundRequest.setSign("FE56DD4AA85C0EECA82C35595A69E153"); + + assertThat(refundRequest.toXML()) + .isEqualTo("\n" + + " wx2421b1c4370ec43b\n" + + " 10000100\n" + + " 6cefdb308e1e2e8aabd48cf79e546a02\n" + + " FE56DD4AA85C0EECA82C35595A69E153\n" + + " \n" + + " 1415757673\n" + + " 1415701182\n" + + " 1\n" + + " 1\n" + + " https://weixin.qq.com/\n" + + " \n" + + ""); + } +} diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResultTest.java index e03028ad42..3df177f2c9 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResultTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResultTest.java @@ -13,7 +13,6 @@ * @author Binary Wang */ public class WxPayRefundResultTest { - @Test public void testFromXML() { /* @@ -49,6 +48,49 @@ public void testFromXML() { assertThat(result.getRefundCoupons().get(0).getCouponRefundFee()).isEqualTo(1); } + @Test + public void testFromXML_danpin() { + //样例来自:https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_103&index=3 + String xmlString = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "1\n" + + "1\n" + + "1\n" + + "1\n" + + "{\"promotion_detail\":[{\"promotion_id\":\"109519\",\"scope\":\"SINGLE\",\"type\":\"DISCOUNT\",\"refund_amount\":5,\"goods_detail\":[{\"goods_id\":\"a_goods1\",\"refund_quantity\":7,\"price\":1,\"refund_amount\":4},{\"goods_id\":\"a_goods2\",\"refund_quantity\":1,\"price\":2,\"refund_amount\":1}]}]}\n" + + ""; + + WxPayRefundResult result = BaseWxPayResult.fromXML(xmlString, WxPayRefundResult.class); + result.composePromotionDetails(); + assertThat(result.getPromotionDetails()).isNotEmpty(); + assertThat(result.getPromotionDetails().get(0).getPromotionId()).isEqualTo("109519"); + assertThat(result.getPromotionDetails().get(0).getRefundAmount()).isEqualTo(5); + assertThat(result.getPromotionDetails().get(0).getScope()).isEqualTo("SINGLE"); + assertThat(result.getPromotionDetails().get(0).getType()).isEqualTo("DISCOUNT"); + + assertThat(result.getPromotionDetails().get(0).getGoodsDetails()).isNotEmpty(); + assertThat(result.getPromotionDetails().get(0).getGoodsDetails().get(0).getGoodsId()).isEqualTo("a_goods1"); + assertThat(result.getPromotionDetails().get(0).getGoodsDetails().get(0).getRefundQuantity()).isEqualTo(7); + assertThat(result.getPromotionDetails().get(0).getGoodsDetails().get(0).getRefundAmount()).isEqualTo(4); + assertThat(result.getPromotionDetails().get(0).getGoodsDetails().get(0).getPrice()).isEqualTo(1); + + assertThat(result.getPromotionDetails().get(0).getGoodsDetails().get(1).getGoodsId()).isEqualTo("a_goods2"); + assertThat(result.getPromotionDetails().get(0).getGoodsDetails().get(1).getRefundQuantity()).isEqualTo(1); + assertThat(result.getPromotionDetails().get(0).getGoodsDetails().get(1).getRefundAmount()).isEqualTo(1); + assertThat(result.getPromotionDetails().get(0).getGoodsDetails().get(1).getPrice()).isEqualTo(2); + } + @Test public void testFromXMLFastMode() { /* 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 9e129bcbeb..c12c38195b 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 @@ -315,6 +315,18 @@ public void testRefund() throws Exception { log.info(result.toString()); } + @Test + public void testRefundV2() throws WxPayException { + WxPayRefundResult result = this.payService.refundV2( + WxPayRefundRequest.newBuilder() + .outRefundNo("aaa") + .outTradeNo("1111") + .totalFee(1222) + .refundFee(111) + .build()); + log.info(result.toString()); + } + /** * Test method for {@link WxPayService#refundQuery(String, String, String, String)} . * @@ -341,6 +353,11 @@ public void testRefundQuery() throws Exception { log.info(result.toString()); } + @Test + public void testRefundQueryV2() throws WxPayException { + this.payService.refundQueryV2(WxPayRefundQueryRequest.newBuilder().outRefundNo("1").build()); + } + /** * Test parse refund notify result. * @@ -686,4 +703,5 @@ public void testQueryExchangeRate() throws WxPayException { assertThat(result).isNotNull(); System.out.println(result); } + } From 8467852c177164e2d4dd347db100bd96f41aa8a0 Mon Sep 17 00:00:00 2001 From: SooHoo Date: Sun, 7 Jun 2020 18:02:59 +0800 Subject: [PATCH 21/90] =?UTF-8?q?:bug:=20#1608=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E5=A4=96=E9=83=A8=E8=81=94?= =?UTF-8?q?=E7=B3=BB=E4=BA=BA=E7=BE=A4=E5=88=97=E8=A1=A8=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/api/impl/WxCpExternalContactServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 044155847e..961b21d522 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 @@ -89,10 +89,10 @@ public WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pa if (ArrayUtils.isNotEmpty(userIds) || ArrayUtils.isNotEmpty(partyIds)) { JsonObject ownerFilter = new JsonObject(); if (ArrayUtils.isNotEmpty(userIds)) { - json.add("userid", new Gson().toJsonTree(userIds).getAsJsonArray()); + json.add("userid_list", new Gson().toJsonTree(userIds).getAsJsonArray()); } if (ArrayUtils.isNotEmpty(partyIds)) { - json.add("partyid", new Gson().toJsonTree(partyIds).getAsJsonArray()); + json.add("partyid_list", new Gson().toJsonTree(partyIds).getAsJsonArray()); } json.add("owner_filter", ownerFilter); } @@ -142,7 +142,7 @@ public WxCpUserExternalGroupChatStatistic getGroupChatStatistic(Date startTime, json.add("userid_list", new Gson().toJsonTree(userIds).getAsJsonArray()); } if (ArrayUtils.isNotEmpty(partyIds)) { - json.add("userid_list", new Gson().toJsonTree(partyIds).getAsJsonArray()); + json.add("partyid_list", new Gson().toJsonTree(partyIds).getAsJsonArray()); } json.add("owner_filter", ownerFilter); } From 0f8361e5583faabc2e92779d3c5f4f59fd847400 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 7 Jun 2020 18:12:27 +0800 Subject: [PATCH 22/90] =?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 --- .../binarywang/wxpay/util/SignUtils.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java index 0d1962ff43..0ce39a7312 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java @@ -25,11 +25,10 @@ */ @Slf4j public class SignUtils { - /** * 签名的时候不携带的参数 */ - private static List NO_SIGN_PARAMS = Lists.newArrayList("sign", "key", "xmlString", "xmlDoc", "couponList"); + private static final List NO_SIGN_PARAMS = Lists.newArrayList("sign", "key", "xmlString", "xmlDoc", "couponList"); /** * 请参考并使用 {@link #createSign(Object, String, String, String[])}. @@ -89,10 +88,8 @@ public static String createSign(Object xmlBean, String signType, String signKey, * @return 签名字符串 string */ public static String createSign(Map params, String signType, String signKey, String[] ignoredParams) { - SortedMap sortedMap = new TreeMap<>(params); - StringBuilder toSign = new StringBuilder(); - for (String key : sortedMap.keySet()) { + for (String key : new TreeMap<>(params).keySet()) { String value = params.get(key); boolean shouldSign = false; if (StringUtils.isNotEmpty(value) && !ArrayUtils.contains(ignoredParams, key) @@ -121,7 +118,7 @@ public static String createSign(Map params, String signType, Str public static String createEntSign(String actName, String mchBillNo, String mchId, String nonceStr, String reOpenid, Integer totalAmount, String wxAppId, String signKey, String signType) { - Map sortedMap = new HashMap<>(); + Map sortedMap = new HashMap<>(8); sortedMap.put("act_name", actName); sortedMap.put("mch_billno", mchBillNo); sortedMap.put("mch_id", mchId); @@ -130,21 +127,18 @@ public static String createEntSign(String actName, String mchBillNo, String mchI sortedMap.put("total_amount", totalAmount + ""); sortedMap.put("wxappid", wxAppId); - Map sortParams = new TreeMap<>(sortedMap); - Set> entries = sortParams.entrySet(); - Iterator> iterator = entries.iterator(); + Iterator> iterator = new TreeMap<>(sortedMap).entrySet().iterator(); StringBuilder toSign = new StringBuilder(); while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - String key = String.valueOf(entry.getKey()); - String value = String.valueOf(entry.getValue()); + Map.Entry entry = iterator.next(); + String value = entry.getValue(); boolean shouldSign = false; if (StringUtils.isNotEmpty(value)) { shouldSign = true; } if (shouldSign) { - toSign.append(key).append("=").append(value).append("&"); + toSign.append(entry.getKey()).append("=").append(value).append("&"); } } //企业微信这里字段名不一样 From 03d9f2d19e6cf8b4689490f399dbeae174d6c0c3 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 7 Jun 2020 20:43:50 +0800 Subject: [PATCH 23/90] =?UTF-8?q?:bookmark:=20=20=E5=8F=91=E5=B8=83=203.8.?= =?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 +- 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 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 01b8a5e57e..565df77567 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.8.1.1.B + 3.8.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 6682837f94..5d3397d1fe 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.1.1.B + 3.8.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 bccd7d9c70..2564573682 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.1.1.B + 3.8.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 6a2aa2a06a..2e7e56d639 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.1.1.B + 3.8.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 676aaea58e..a6eda56553 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.1.1.B + 3.8.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 92401b9430..787db5a14d 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.1.1.B + 3.8.2.B 4.0.0 diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml index a77c4966f7..6ae6b19883 100644 --- a/weixin-graal/pom.xml +++ b/weixin-graal/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.1.1.B + 3.8.2.B weixin-graal diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 17d8e238c3..a3a35a461c 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.1.1.B + 3.8.2.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 4bbe2f9472..11854b3c81 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.1.1.B + 3.8.2.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index fc65d4d0cd..f753e02342 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.1.1.B + 3.8.2.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index d36f392af8..6440fd25c7 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.1.1.B + 3.8.2.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 109f017c71..4c0d6ec720 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.1.1.B + 3.8.2.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index db9dce02e6..506f5025ff 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.8.1.1.B + 3.8.2.B 4.0.0 From a81550f79f6f52275f4fd388b51ae60535d89e62 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 11 Jun 2020 17:40:20 +0800 Subject: [PATCH 24/90] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/bean/result/BaseWxPayResult.java | 39 ++++++++----------- .../result/WxPayAuthcode2OpenidResult.java | 5 ++- .../wxpay/bean/result/WxPayBillInfo.java | 4 +- .../wxpay/bean/result/WxPayCommonResult.java | 6 ++- .../wxpay/bean/result/WxPayFacepayResult.java | 1 - .../bean/result/WxPayFundFlowBaseResult.java | 4 +- .../bean/result/WxPayFundFlowResult.java | 6 +-- .../bean/result/WxPayMicropayResult.java | 4 +- .../bean/result/WxPayOrderCloseResult.java | 6 ++- .../bean/result/WxPayOrderQueryResult.java | 2 +- .../bean/result/WxPayOrderReverseResult.java | 6 ++- .../result/WxPayQueryExchangeRateResult.java | 4 +- .../bean/result/WxPayRedpackQueryResult.java | 2 +- .../bean/result/WxPayRefundCouponInfo.java | 5 ++- .../bean/result/WxPayRefundQueryResult.java | 14 +++---- .../result/WxPaySandboxSignKeyResult.java | 6 ++- .../WxPaySendMiniProgramRedpackResult.java | 1 + .../bean/result/WxPayShorturlResult.java | 5 ++- .../bean/result/WxPayUnifiedOrderResult.java | 5 ++- 19 files changed, 72 insertions(+), 53 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 1f6eba15c2..51865664f4 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 @@ -1,27 +1,10 @@ package com.github.binarywang.wxpay.bean.result; -import java.io.ByteArrayInputStream; -import java.io.Serializable; -import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Map; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; - -import com.github.binarywang.wxpay.util.XmlConfig; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.w3c.dom.NodeList; - 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.github.binarywang.wxpay.util.XmlConfig; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -30,8 +13,22 @@ import lombok.Data; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.common.util.xml.XStreamInitializer; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; -import org.w3c.dom.*; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; +import java.io.ByteArrayInputStream; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; /** *
@@ -42,9 +39,7 @@
  * @author Binary Wang
  */
 @Data
-public abstract class BaseWxPayResult implements Serializable {
-  private static final long serialVersionUID = -3559552761816864481L;
-
+public abstract class BaseWxPayResult {
   /**
    * 返回状态码.
    */
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
index 03e35b1c9b..eea7d8af46 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayAuthcode2OpenidResult.java
@@ -6,6 +6,8 @@
 import lombok.NoArgsConstructor;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 
  *  授权码查询openid接口请求结果类
@@ -18,7 +20,8 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayAuthcode2OpenidResult extends BaseWxPayResult {
+public class WxPayAuthcode2OpenidResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = -2409408725777108398L;
   /**
    * 
    *   用户标识.
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java
index f77d49e788..49b5b7bf31 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java
@@ -1,11 +1,11 @@
 package com.github.binarywang.wxpay.bean.result;
 
-import java.io.Serializable;
-
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
+import java.io.Serializable;
+
 /**
  * 交易时间:2017-04-06 01:00:02 公众账号ID: 商户号: 子商户号:0 设备号:WEB 微信订单号: 商户订单号:2017040519091071873216 用户标识: 交易类型:NATIVE
  * 交易状态:REFUND 付款银行:CFT 货币种类:CNY 总金额:0.00 企业红包金额:0.00 微信退款单号: 商户退款单号:20170406010000933 退款金额:0.01 企业红包退款金额:0.00
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayCommonResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayCommonResult.java
index 614bdc2a32..35e29a9e01 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayCommonResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayCommonResult.java
@@ -3,6 +3,8 @@
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 
  * 微信支付结果仅包含有return 和result等相关信息的的属性类
@@ -12,7 +14,9 @@
  * @author Binary Wang
  */
 @XStreamAlias("xml")
-public class WxPayCommonResult extends BaseWxPayResult {
+public class WxPayCommonResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = -8051324891539367420L;
+
   @Override
   protected void loadXml(Document d) {
   }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
index 1b100ac4f3..5fd6cfe8eb 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java
@@ -19,7 +19,6 @@
 @NoArgsConstructor
 @XStreamAlias("xml")
 public class WxPayFacepayResult extends BaseWxPayResult {
-
   private static final long serialVersionUID = -4116580976046716911L;
 
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFundFlowBaseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFundFlowBaseResult.java
index 75ee1509fd..ab9077615b 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFundFlowBaseResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFundFlowBaseResult.java
@@ -1,11 +1,11 @@
 package com.github.binarywang.wxpay.bean.result;
 
-import java.io.Serializable;
-
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
+import java.io.Serializable;
+
 /**
  * 记账时间:2018-02-01 04:21:23 微信支付业务单号:50000305742018020103387128253 资金流水单号:1900009231201802015884652186 业务名称:退款
  * 业务类型:退款 收支类型:支出 收支金额(元):0.02 账户结余(元):0.17 资金变更提交申请人:system 备注:缺货 业务凭证号:REF4200000068201801293084726067
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFundFlowResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFundFlowResult.java
index 7b789ca0cd..3f26e0654e 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFundFlowResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFundFlowResult.java
@@ -1,12 +1,12 @@
 package com.github.binarywang.wxpay.bean.result;
 
-import java.io.Serializable;
-import java.util.List;
-
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
+import java.io.Serializable;
+import java.util.List;
+
 /**
  * 
  * 下载资金账单接口响应结果对象类
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
index 678916d888..1eb1a7a604 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayMicropayResult.java
@@ -6,6 +6,8 @@
 import lombok.NoArgsConstructor;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 
  * 提交刷卡支付接口响应结果对象类
@@ -18,7 +20,7 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayMicropayResult extends BaseWxPayResult {
+public class WxPayMicropayResult extends BaseWxPayResult implements Serializable {
   private static final long serialVersionUID = 529670965722059189L;
 
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
index a98fec86ab..8be7e858dd 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderCloseResult.java
@@ -6,6 +6,8 @@
 import lombok.NoArgsConstructor;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 
  * 关闭订单结果对象类
@@ -18,8 +20,8 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayOrderCloseResult extends BaseWxPayResult {
-
+public class WxPayOrderCloseResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = 800873502890274834L;
   /**
    * 业务结果描述
    */
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
index d21e1375d6..aa9985dfa9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderQueryResult.java
@@ -27,7 +27,7 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayOrderQueryResult extends BaseWxPayResult {
+public class WxPayOrderQueryResult extends BaseWxPayResult implements Serializable {
   private static final long serialVersionUID = 8241891654782412789L;
 
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
index 0f9abd3a7f..e725ac5689 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayOrderReverseResult.java
@@ -6,6 +6,8 @@
 import lombok.NoArgsConstructor;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 
  * 撤销订单响应结果类
@@ -18,8 +20,8 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayOrderReverseResult extends BaseWxPayResult {
-
+public class WxPayOrderReverseResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = 3615350465758009338L;
   /**
    * 
    * 是否重调
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java
index 957547e1b4..c6f9409933 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java
@@ -6,6 +6,8 @@
 import lombok.NoArgsConstructor;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 汇率查询响应.
  *
@@ -16,7 +18,7 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayQueryExchangeRateResult extends BaseWxPayResult {
+public class WxPayQueryExchangeRateResult extends BaseWxPayResult implements Serializable {
   private static final long serialVersionUID = 2269734222658532364L;
 
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
index 90f9a70e42..88a1f3e4e5 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRedpackQueryResult.java
@@ -23,7 +23,7 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayRedpackQueryResult extends BaseWxPayResult {
+public class WxPayRedpackQueryResult extends BaseWxPayResult implements Serializable {
   private static final long serialVersionUID = -3849864122189552906L;
 
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundCouponInfo.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundCouponInfo.java
index 290e472313..5db5c0581f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundCouponInfo.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundCouponInfo.java
@@ -5,6 +5,8 @@
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 
  *  退款代金券信息.
@@ -16,7 +18,8 @@
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class WxPayRefundCouponInfo {
+public class WxPayRefundCouponInfo implements Serializable {
+  private static final long serialVersionUID = -8493640819570138722L;
   /**
    * 
    * 字段名:退款代金券ID.
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
index fe17e1477e..d67edc1ab3 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
@@ -1,21 +1,18 @@
 package com.github.binarywang.wxpay.bean.result;
 
-import java.util.List;
-
 import com.google.common.collect.Lists;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
+import lombok.*;
 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;
+
 /**
  * 
  * 微信支付-退款查询返回结果
@@ -28,7 +25,8 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayRefundQueryResult extends BaseWxPayResult {
+public class WxPayRefundQueryResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = 5392369423225328754L;
   /**
    * 
    * 字段名:设备号.
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
index afc8a94e09..aec190364c 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySandboxSignKeyResult.java
@@ -6,6 +6,8 @@
 import lombok.NoArgsConstructor;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 
  *  Created by BinaryWang on 2017/6/18.
@@ -17,8 +19,8 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPaySandboxSignKeyResult extends BaseWxPayResult {
-
+public class WxPaySandboxSignKeyResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = -5793375529340378941L;
   /**
    * 
    * 沙箱密钥
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
index a3ac787cf9..f461e27b6d 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPaySendMiniProgramRedpackResult.java
@@ -18,6 +18,7 @@
 @NoArgsConstructor
 @XStreamAlias("xml")
 public class WxPaySendMiniProgramRedpackResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = 5847928569755121611L;
   /**
    * 商户订单号.
    */
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
index 6b692ec080..da1c97d7d5 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayShorturlResult.java
@@ -6,6 +6,8 @@
 import lombok.NoArgsConstructor;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 
  * 转换短链接结果对象类
@@ -18,7 +20,8 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayShorturlResult extends BaseWxPayResult {
+public class WxPayShorturlResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = -2121902492357304418L;
   /**
    * 
    * URL链接
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
index 60d7e7f013..eec2e37fed 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderResult.java
@@ -6,6 +6,8 @@
 import lombok.NoArgsConstructor;
 import org.w3c.dom.Document;
 
+import java.io.Serializable;
+
 /**
  * 
  * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"返回的结果
@@ -18,7 +20,8 @@
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @XStreamAlias("xml")
-public class WxPayUnifiedOrderResult extends BaseWxPayResult {
+public class WxPayUnifiedOrderResult extends BaseWxPayResult implements Serializable {
+  private static final long serialVersionUID = -4006038483273621997L;
 
   /**
    * 微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时

From 29b4dbd601bfd963e053a2a5d1477986e3a38c42 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Thu, 11 Jun 2020 18:16:30 +0800
Subject: [PATCH 25/90] =?UTF-8?q?:art:=20#1610=20=E6=8D=A2=E7=94=A8guava?=
 =?UTF-8?q?=E7=9A=84=E7=9B=B8=E5=BA=94=E6=96=B9=E6=B3=95=E5=AE=9E=E7=8E=B0?=
 =?UTF-8?q?base64=E8=A7=A3=E7=A0=81=EF=BC=8C=E9=81=BF=E5=85=8D=E5=9B=A0com?=
 =?UTF-8?q?mons-codec=E7=89=88=E6=9C=AC=E9=97=AE=E9=A2=98=E5=AF=BC?=
 =?UTF-8?q?=E8=87=B4=E8=A7=A3=E7=A0=81=E5=BC=82=E5=B8=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/util/crypto/WxCryptUtil.java       |  4 ++-
 .../weixin/cp/util/crypto/WxCpCryptUtil.java  | 33 ++-----------------
 .../cp/util/crypto/WxCpTpCryptUtil.java       |  5 +--
 .../cp/util/crypto/WxCpCryptUtilTest.java     | 24 ++++++++++++++
 .../wx/miniapp/util/crypt/WxMaCryptUtils.java |  4 ++-
 .../weixin/mp/util/crypto/WxMpCryptUtil.java  |  4 ++-
 .../weixin/open/util/WxOpenCryptUtil.java     |  4 ++-
 .../binarywang/wxpay/v3/util/AesUtils.java    |  4 ++-
 8 files changed, 45 insertions(+), 37 deletions(-)
 create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtilTest.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 5c16e71cec..0103fc7f06 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
@@ -12,6 +12,8 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import com.google.common.base.CharMatcher;
+import com.google.common.io.BaseEncoding;
 import org.apache.commons.codec.binary.Base64;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -64,7 +66,7 @@ public WxCryptUtil() {
   public WxCryptUtil(String token, String encodingAesKey, String appidOrCorpid) {
     this.token = token;
     this.appidOrCorpid = appidOrCorpid;
-    this.aesKey = Base64.decodeBase64(encodingAesKey + "=");
+    this.aesKey = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(encodingAesKey));
   }
 
   private static String extractEncryptPart(String xml) {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtil.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtil.java
index 770ef82797..2914945b89 100755
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtil.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtil.java
@@ -1,37 +1,11 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- *
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- * 

- * 针对org.apache.commons.codec.binary.Base64, - * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) - * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi - *

- * 针对org.apache.commons.codec.binary.Base64, - * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) - * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi - */ - -// ------------------------------------------------------------------------ - -/** - * 针对org.apache.commons.codec.binary.Base64, - * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) - * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi - */ package me.chanjar.weixin.cp.util.crypto; +import com.google.common.base.CharMatcher; +import com.google.common.io.BaseEncoding; import me.chanjar.weixin.common.util.crypto.WxCryptUtil; import me.chanjar.weixin.cp.config.WxCpConfigStorage; -import org.apache.commons.codec.binary.Base64; public class WxCpCryptUtil extends WxCryptUtil { - - /** - * 构造函数 - * - * @param wxCpConfigStorage - */ public WxCpCryptUtil(WxCpConfigStorage wxCpConfigStorage) { /* * @param token 公众平台上,开发者设置的token @@ -44,8 +18,7 @@ public WxCpCryptUtil(WxCpConfigStorage wxCpConfigStorage) { this.token = token; this.appidOrCorpid = corpId; - this.aesKey = Base64.decodeBase64(encodingAesKey + "="); + this.aesKey = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(encodingAesKey)); } - } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java index e45ef2ecf0..900f7ea8aa 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java @@ -1,8 +1,9 @@ package me.chanjar.weixin.cp.util.crypto; +import com.google.common.base.CharMatcher; +import com.google.common.io.BaseEncoding; import me.chanjar.weixin.common.util.crypto.WxCryptUtil; import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; -import org.apache.commons.codec.binary.Base64; /** * @author someone @@ -23,7 +24,7 @@ public WxCpTpCryptUtil(WxCpTpConfigStorage wxCpTpConfigStorage) { this.token = token; this.appidOrCorpid = corpId; - this.aesKey = Base64.decodeBase64(encodingAesKey + "="); + this.aesKey = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(encodingAesKey)); } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtilTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtilTest.java new file mode 100644 index 0000000000..62fbce13b8 --- /dev/null +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtilTest.java @@ -0,0 +1,24 @@ +package me.chanjar.weixin.cp.util.crypto; + +import com.google.common.base.CharMatcher; +import com.google.common.io.BaseEncoding; +import org.apache.commons.codec.binary.Base64; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; + +/** + * @author Binary Wang + * @date 2020-06-11 + */ +public class WxCpCryptUtilTest { + @Test + public void test() { + String encodingAesKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C"; + final byte[] commonsCodec = Base64.decodeBase64(encodingAesKey + "="); + final byte[] guava = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(encodingAesKey)); + final byte[] guava1 = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(encodingAesKey + "=")); + assertEquals(commonsCodec, guava); + assertEquals(guava1, guava); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/crypt/WxMaCryptUtils.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/crypt/WxMaCryptUtils.java index 23ea851b3f..6913541de7 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/crypt/WxMaCryptUtils.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/crypt/WxMaCryptUtils.java @@ -10,6 +10,8 @@ import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import com.google.common.base.CharMatcher; +import com.google.common.io.BaseEncoding; import org.apache.commons.codec.binary.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; @@ -25,7 +27,7 @@ public class WxMaCryptUtils extends me.chanjar.weixin.common.util.crypto.WxCrypt public WxMaCryptUtils(WxMaConfig config) { this.appidOrCorpid = config.getAppid(); this.token = config.getToken(); - this.aesKey = Base64.decodeBase64(config.getAesKey() + "="); + this.aesKey = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(config.getAesKey())); } /** diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java index 945219acf5..8ceba29c26 100755 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java @@ -17,6 +17,8 @@ */ package me.chanjar.weixin.mp.util.crypto; +import com.google.common.base.CharMatcher; +import com.google.common.io.BaseEncoding; import me.chanjar.weixin.mp.config.WxMpConfigStorage; import org.apache.commons.codec.binary.Base64; @@ -39,7 +41,7 @@ public WxMpCryptUtil(WxMpConfigStorage wxMpConfigStorage) { this.token = token; this.appidOrCorpid = appId; - this.aesKey = Base64.decodeBase64(encodingAesKey + "="); + this.aesKey = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(encodingAesKey)); } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java index a27b6fe636..5b11878d28 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java @@ -1,5 +1,7 @@ package me.chanjar.weixin.open.util; +import com.google.common.base.CharMatcher; +import com.google.common.io.BaseEncoding; import me.chanjar.weixin.open.api.WxOpenConfigStorage; import org.apache.commons.codec.binary.Base64; @@ -24,6 +26,6 @@ public WxOpenCryptUtil(WxOpenConfigStorage wxOpenConfigStorage) { this.token = token; this.appidOrCorpid = appId; - this.aesKey = Base64.decodeBase64(encodingAesKey + "="); + this.aesKey = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(encodingAesKey)); } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/AesUtils.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/AesUtils.java index bd68cac1a4..4030965ebe 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/AesUtils.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/AesUtils.java @@ -1,5 +1,7 @@ package com.github.binarywang.wxpay.v3.util; +import com.google.common.base.CharMatcher; +import com.google.common.io.BaseEncoding; import org.apache.commons.lang3.StringUtils; import java.io.IOException; @@ -41,7 +43,7 @@ public String decryptToString(byte[] associatedData, byte[] nonce, String cipher cipher.init(Cipher.DECRYPT_MODE, key, spec); cipher.updateAAD(associatedData); - return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8"); + return new String(cipher.doFinal(BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(ciphertext))), "utf-8"); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { throw new IllegalStateException(e); } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { From 3b37f52235a3ce09b417dceb183dc1d00b03b8a2 Mon Sep 17 00:00:00 2001 From: wuxingye <23226334@qq.com> Date: Mon, 15 Jun 2020 14:36:27 +0800 Subject: [PATCH 26/90] =?UTF-8?q?#1620=20:art:=20=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E6=A8=A1=E5=9D=97=E9=85=8D=E7=BD=AE=E7=B1=BB=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0Redisson=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: xingye.wu --- weixin-java-mp/pom.xml | 4 + .../config/impl/WxMpRedissonConfigImpl.java | 101 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedissonConfigImpl.java diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 6440fd25c7..66f744313e 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -80,6 +80,10 @@ org.projectlombok lombok + + org.redisson + redisson + diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedissonConfigImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedissonConfigImpl.java new file mode 100644 index 0000000000..f1aa6b9ca7 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedissonConfigImpl.java @@ -0,0 +1,101 @@ +package me.chanjar.weixin.mp.config.impl; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NonNull; +import me.chanjar.weixin.common.enums.TicketType; +import me.chanjar.weixin.common.redis.RedissonWxRedisOps; +import me.chanjar.weixin.common.redis.WxRedisOps; +import org.redisson.api.RedissonClient; + +import java.util.concurrent.TimeUnit; + +/** + * @author wuxingye + * @date 2020/6/12 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class WxMpRedissonConfigImpl extends WxMpDefaultConfigImpl { + + private static final long serialVersionUID = -5139855123878455556L; + private static final String ACCESS_TOKEN_KEY_TPL = "%s:access_token:%s"; + private static final String TICKET_KEY_TPL = "%s:ticket:key:%s:%s"; + private static final String LOCK_KEY_TPL = "%s:lock:%s:"; + private final WxRedisOps redisOps; + private final String keyPrefix; + private String accessTokenKey; + private String lockKey; + + public WxMpRedissonConfigImpl(@NonNull RedissonClient redissonClient, String keyPrefix) { + this(new RedissonWxRedisOps(redissonClient), keyPrefix); + } + + public WxMpRedissonConfigImpl(@NonNull RedissonClient redissonClient) { + this(redissonClient, null); + } + + private WxMpRedissonConfigImpl(@NonNull WxRedisOps redisOps, String keyPrefix) { + this.redisOps = redisOps; + this.keyPrefix = keyPrefix; + } + + /** + * 每个公众号生成独有的存储key. + */ + @Override + public void setAppId(String appId) { + super.setAppId(appId); + this.accessTokenKey = String.format(ACCESS_TOKEN_KEY_TPL, this.keyPrefix, appId); + this.lockKey = String.format(LOCK_KEY_TPL, this.keyPrefix, appId); + accessTokenLock = this.redisOps.getLock(lockKey.concat("accessTokenLock")); + jsapiTicketLock = this.redisOps.getLock(lockKey.concat("jsapiTicketLock")); + sdkTicketLock = this.redisOps.getLock(lockKey.concat("sdkTicketLock")); + cardApiTicketLock = this.redisOps.getLock(lockKey.concat("cardApiTicketLock")); + } + + private String getTicketRedisKey(TicketType type) { + return String.format(TICKET_KEY_TPL, this.keyPrefix, appId, type.getCode()); + } + + @Override + public String getAccessToken() { + return redisOps.getValue(this.accessTokenKey); + } + + @Override + public boolean isAccessTokenExpired() { + Long expire = redisOps.getExpire(this.accessTokenKey); + return expire == null || expire < 2; + } + + @Override + public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { + redisOps.setValue(this.accessTokenKey, accessToken, expiresInSeconds - 200, TimeUnit.SECONDS); + } + + @Override + public void expireAccessToken() { + redisOps.expire(this.accessTokenKey, 0, TimeUnit.SECONDS); + } + + @Override + public String getTicket(TicketType type) { + return redisOps.getValue(this.getTicketRedisKey(type)); + } + + @Override + public boolean isTicketExpired(TicketType type) { + return redisOps.getExpire(this.getTicketRedisKey(type)) < 2; + } + + @Override + public synchronized void updateTicket(TicketType type, String jsapiTicket, int expiresInSeconds) { + redisOps.setValue(this.getTicketRedisKey(type), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); + } + + @Override + public void expireTicket(TicketType type) { + redisOps.expire(this.getTicketRedisKey(type), 0, TimeUnit.SECONDS); + } +} From 8256c46db26925e4a4edf31bd3fc10fc23298d02 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 15 Jun 2020 20:30:38 +0800 Subject: [PATCH 27/90] =?UTF-8?q?:art:=20#1619=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96=EF=BC=8C=E5=A4=84?= =?UTF-8?q?=E7=90=86type=E4=B8=BAnull=E6=83=85=E5=86=B5=E4=B8=8B=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=BC=9A=E5=AF=BC=E8=87=B4=E7=9A=84=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/cp/bean/WxCpUser.java | 4 ++-- .../cp/util/json/WxCpUserGsonAdapter.java | 23 +++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java index c44400a735..5a91fbf691 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 @@ -89,7 +89,7 @@ public static class Attr { /** * 属性类型: 0-文本 1-网页 */ - private int type; + private Integer type; private String name; private String textValue; private String webUrl; @@ -104,7 +104,7 @@ public static class ExternalAttribute { /** * 属性类型: 0-本文 1-网页 2-小程序. */ - private int type; + private Integer type; /** * 属性名称: 需要先确保在管理端有创建改属性,否则会忽略. */ 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 4ce0afda1c..deaac491fc 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 @@ -98,6 +98,10 @@ private void buildExtraAttrs(JsonObject o, WxCpUser user) { .setName(GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name")); user.getExtAttrs().add(attr); + if (type == null) { + continue; + } + switch (type) { case 0: { attr.setTextValue(GsonHelper.getString(attrJsonElement.getAsJsonObject().get("text").getAsJsonObject(), "value")); @@ -120,6 +124,10 @@ private void buildExternalAttrs(JsonObject o, WxCpUser user) { final Integer type = GsonHelper.getInteger(element.getAsJsonObject(), "type"); final String name = GsonHelper.getString(element.getAsJsonObject(), "name"); + if (type == null) { + continue; + } + switch (type) { case 0: { user.getExternalAttrs() @@ -253,6 +261,12 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon for (WxCpUser.Attr attr : user.getExtAttrs()) { JsonObject attrJson = new JsonObject(); + attrsJsonArray.add(attrJson); + + if (attr.getType() == null) { + continue; + } + switch (attr.getType()) { case 0: { JsonObject text = new JsonObject(); @@ -269,7 +283,6 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon } default: //ignored } - attrsJsonArray.add(attrJson); } JsonObject attrsJson = new JsonObject(); attrsJson.add("attrs", attrsJsonArray); @@ -293,6 +306,13 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon JsonObject attrJson = new JsonObject(); attrJson.addProperty("type", attr.getType()); attrJson.addProperty("name", attr.getName()); + + attrsJsonArray.add(attrJson); + + if (attr.getType() == null) { + continue; + } + switch (attr.getType()) { case 0: { JsonObject text = new JsonObject(); @@ -317,7 +337,6 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon } default://忽略 } - attrsJsonArray.add(attrJson); } attrsJson.add(EXTERNAL_ATTR, attrsJsonArray); From 1ae00b67df7206d2868604bb9360a9fbbcec8310 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 16 Jun 2020 14:19:05 +0800 Subject: [PATCH 28/90] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/service/impl/BaseWxPayServiceImplTest.java | 2 +- .../binarywang/wxpay/testbase/ApiTestModule.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) 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 c12c38195b..779916162c 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 @@ -67,7 +67,7 @@ public void testUnifiedOrder() throws WxPayException { request.setSignType(SignType.HMAC_SHA256); WxPayUnifiedOrderResult result = this.payService.unifiedOrder(request); log.info(result.toString()); -// log.warn(this.payService.getWxApiData().toString()); + log.warn(this.payService.getWxApiData().toString()); } /** diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/testbase/ApiTestModule.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/testbase/ApiTestModule.java index d46c98c426..b29b1af16c 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/testbase/ApiTestModule.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/testbase/ApiTestModule.java @@ -1,11 +1,5 @@ package com.github.binarywang.wxpay.testbase; -import java.io.IOException; -import java.io.InputStream; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; @@ -13,6 +7,11 @@ import com.google.inject.Module; import com.thoughtworks.xstream.XStream; import me.chanjar.weixin.common.util.xml.XStreamInitializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; /** * The type Api test module. @@ -29,6 +28,7 @@ public void configure(Binder binder) { } XmlWxPayConfig config = this.fromXml(XmlWxPayConfig.class, inputStream); + config.setIfSaveApiData(true); WxPayService wxService = new WxPayServiceImpl(); wxService.setConfig(config); From 320f3676a8f6d9070bc573ee1512c40184483f29 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 16 Jun 2020 16:53:26 +0800 Subject: [PATCH 29/90] =?UTF-8?q?:art:=20#1619=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96=EF=BC=8C=E5=A4=84?= =?UTF-8?q?=E7=90=86type=E4=B8=BAnull=E6=83=85=E5=86=B5=E4=B8=8B=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=BC=9A=E5=AF=BC=E8=87=B4=E7=9A=84=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=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/util/json/WxCpUserGsonAdapter.java | 1 + 1 file changed, 1 insertion(+) 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 deaac491fc..51303b602b 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 @@ -99,6 +99,7 @@ private void buildExtraAttrs(JsonObject o, WxCpUser user) { user.getExtAttrs().add(attr); if (type == null) { + attr.setTextValue(GsonHelper.getString(attrJsonElement.getAsJsonObject(), "value")); continue; } From c2034cb655d316b84c2f43a30f6a6ba25b496361 Mon Sep 17 00:00:00 2001 From: sdlszjb Date: Wed, 17 Jun 2020 21:48:37 +0800 Subject: [PATCH 30/90] =?UTF-8?q?:art:=20#1624=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=A8=A1=E5=9D=97=E6=9B=B4=E6=96=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BF=A1=E6=81=AF=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=B1=BB=E4=BB=A5=E9=80=82=E5=BA=94=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=A7=81=E6=9C=89=E5=8C=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/cp/bean/WxCpUser.java | 1 + .../cp/util/json/WxCpUserGsonAdapter.java | 21 +++++ ...erGsonAdapterForPrivatizedVersionTest.java | 89 +++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterForPrivatizedVersionTest.java 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 5a91fbf691..a6ceb4e551 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 @@ -26,6 +26,7 @@ public class WxCpUser implements Serializable { private Long[] departIds; private Integer[] orders; private String position; + private String[] positions; private String mobile; private Gender gender; private String email; 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 51303b602b..e721b33acf 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 @@ -54,6 +54,16 @@ public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationC user.setOrders(orders); } + if (o.get("positions") != null) { + JsonArray positionJsonArray = o.get("positions").getAsJsonArray(); + String[] positions = new String[positionJsonArray.size()]; + int i = 0; + for (JsonElement jsonElement : positionJsonArray) { + positions[i++] = jsonElement.getAsString(); + } + user.setPositions(positions); + } + user.setUserId(GsonHelper.getString(o, "userid")); user.setName(GsonHelper.getString(o, "name")); user.setPosition(GsonHelper.getString(o, "position")); @@ -198,6 +208,15 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon if (user.getPosition() != null) { o.addProperty("position", user.getPosition()); } + + if (user.getPositions() != null) { + JsonArray jsonArray = new JsonArray(); + for (String position : user.getPositions()) { + jsonArray.add(new JsonPrimitive(position)); + } + o.add("positions", jsonArray); + } + if (user.getMobile() != null) { o.addProperty("mobile", user.getMobile()); } @@ -265,6 +284,8 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon attrsJsonArray.add(attrJson); if (attr.getType() == null) { + attrJson.addProperty("name", attr.getName()); + attrJson.addProperty("value", attr.getTextValue()); continue; } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterForPrivatizedVersionTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterForPrivatizedVersionTest.java new file mode 100644 index 0000000000..167de73c46 --- /dev/null +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterForPrivatizedVersionTest.java @@ -0,0 +1,89 @@ +package me.chanjar.weixin.cp.util.json; + +import me.chanjar.weixin.cp.bean.WxCpUser; +import org.testng.annotations.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + *

+ * 企业微信(私有化版本getUser兼容测试)
+ * 
+ * + * @author 庄壮壮 + * @since 2020-06-16 09:36 + */ +public class WxCpUserGsonAdapterForPrivatizedVersionTest { + + @Test + public void testDeserialize() { + final String userJson = "{\n" + + " \"errcode\": 0,\n" + + " \"errmsg\": \"ok\",\n" + + " \"userid\": \"zhangsan\",\n" + + " \"name\": \"李四\",\n" + + " \"department\": [1, 2],\n" + + " \"order\": [2, 10],\n" + + " \"position\": \"后台工程师1\",\n" + + " \"positions\": [\"后台工程师1\",\"后台工程师2\"],\n" + + " \"mobile\": \"15913215421\",\n" + + " \"hide_mobile\": 0,\n" + + " \"gender\": \"1\",\n" + + " \"email\": \"zhangsan@gzdev.com\",\n" + + " \"is_leader_in_dept\": [1, 0],\n" + + " \"avatar\": \"http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0\",\n" + + " \"telephone\": \"020-123456\",\n" + + " \"english_name\": \"jackzhang\",\n" + + " \"extattr\": {\"attrs\":[{\"name\":\"爱好\",\"value\":\"旅游\"},{\"name\":\"卡号\",\"value\":\"1234567234\"}]},\n" + + " \"status\": 1,\n" + + " \"enable\": 0,\n" + + " \"qr_code\": \"https://wwlocal.qq.com/wework_admin/userQRCode?vcode=vc2140a8b3c6207c74&lvc=vcf6f1acfdc4b45088\"\n" + + "}"; + + final WxCpUser user = WxCpUser.fromJson(userJson); + assertThat(user).isNotNull(); + + // test order + assertThat(user.getOrders()).isNotEmpty(); + assertThat(user.getOrders().length).isEqualTo(2); + assertThat(user.getOrders()[0]).isEqualTo(2); + assertThat(user.getOrders()[1]).isEqualTo(10); + + // test english name + assertThat(user.getEnglishName()).isEqualTo("jackzhang"); + + // test extattrs + assertThat(user.getExtAttrs()).isNotEmpty(); + final WxCpUser.Attr extraAttr1 = user.getExtAttrs().get(0); + assertThat(extraAttr1.getName()).isEqualTo("爱好"); + assertThat(extraAttr1.getTextValue()).isEqualTo("旅游"); + final WxCpUser.Attr extraAttr2 = user.getExtAttrs().get(1); + assertThat(extraAttr2.getName()).isEqualTo("卡号"); + assertThat(extraAttr2.getTextValue()).isEqualTo("1234567234"); + + // test position + assertThat(user.getPosition()).isEqualTo("后台工程师1"); + // test positions + assertThat(user.getPositions()).isNotEmpty(); + assertThat(user.getPositions().length).isEqualTo(2); + assertThat(user.getPositions()[0]).isEqualTo("后台工程师1"); + assertThat(user.getPositions()[1]).isEqualTo("后台工程师2"); + } + + @Test + public void testSerialize() { + WxCpUser user = new WxCpUser(); + user.setOrders(new Integer[]{1, 2}); + user.setPositions(new String[]{"后台工程师1", "后台工程师2"}); + user.setEnglishName("jackson"); + WxCpUser.Attr attr1 = new WxCpUser.Attr(); + attr1.setName("爱好").setTextValue("旅游"); + WxCpUser.Attr attr2 = new WxCpUser.Attr(); + attr2.setName("卡号").setTextValue("1234567234"); + + user.addExtAttr(attr1); + user.addExtAttr(attr2); + + assertThat(user.toJson()).isEqualTo("{\"order\":[1,2],\"positions\":[\"后台工程师1\",\"后台工程师2\"],\"english_name\":\"jackson\",\"extattr\":{\"attrs\":[{\"name\":\"爱好\",\"value\":\"旅游\"},{\"name\":\"卡号\",\"value\":\"1234567234\"}]},\"external_profile\":{}}"); + } +} From a0c370ba6654e3d25ddea3cb342ac57771c27a9b Mon Sep 17 00:00:00 2001 From: miemieYaho Date: Thu, 18 Jun 2020 16:09:54 +0800 Subject: [PATCH 31/90] =?UTF-8?q?:art:=20#1627=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8Fstarter=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E4=BE=9D=E8=B5=96jedis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../miniapp/config/WxMaAutoConfiguration.java | 51 +++++------- .../miniapp/properties/ConfigStorage.java | 65 --------------- .../miniapp/properties/RedisProperties.java | 52 ------------ .../miniapp/properties/WxMaProperties.java | 81 ++++++++++++++++++- 4 files changed, 101 insertions(+), 148 deletions(-) delete mode 100644 spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/ConfigStorage.java delete mode 100644 spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/RedisProperties.java diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java index 0aad25f143..7c727c9687 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/config/WxMaAutoConfiguration.java @@ -9,8 +9,6 @@ import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; import com.binarywang.spring.starter.wxjava.miniapp.enums.HttpClientType; -import com.binarywang.spring.starter.wxjava.miniapp.properties.ConfigStorage; -import com.binarywang.spring.starter.wxjava.miniapp.properties.RedisProperties; import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties; import lombok.AllArgsConstructor; import me.chanjar.weixin.common.redis.JedisWxRedisOps; @@ -89,7 +87,7 @@ public WxMaConfig wxMaConfig() { config.setAesKey(StringUtils.trimToNull(this.wxMaProperties.getAesKey())); config.setMsgDataFormat(StringUtils.trimToNull(this.wxMaProperties.getMsgDataFormat())); - ConfigStorage configStorageProperties = wxMaProperties.getConfigStorage(); + WxMaProperties.ConfigStorage configStorageProperties = wxMaProperties.getConfigStorage(); config.setHttpProxyHost(configStorageProperties.getHttpProxyHost()); config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername()); config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword()); @@ -104,10 +102,27 @@ private WxMaDefaultConfigImpl wxMaDefaultConfigStorage() { } private WxMaDefaultConfigImpl wxMaJedisConfigStorage() { - RedisProperties redisProperties = wxMaProperties.getConfigStorage().getRedis(); + WxMaProperties.RedisProperties redisProperties = wxMaProperties.getConfigStorage().getRedis(); JedisPool jedisPool; - if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) { - jedisPool = getJedisPool(); + if (StringUtils.isNotEmpty(redisProperties.getHost())) { + JedisPoolConfig config = new JedisPoolConfig(); + if (redisProperties.getMaxActive() != null) { + config.setMaxTotal(redisProperties.getMaxActive()); + } + if (redisProperties.getMaxIdle() != null) { + config.setMaxIdle(redisProperties.getMaxIdle()); + } + if (redisProperties.getMaxWaitMillis() != null) { + config.setMaxWaitMillis(redisProperties.getMaxWaitMillis()); + } + if (redisProperties.getMinIdle() != null) { + config.setMinIdle(redisProperties.getMinIdle()); + } + config.setTestOnBorrow(true); + config.setTestWhileIdle(true); + + jedisPool = new JedisPool(config, redisProperties.getHost(), redisProperties.getPort(), + redisProperties.getTimeout(), redisProperties.getPassword(), redisProperties.getDatabase()); } else { jedisPool = applicationContext.getBean(JedisPool.class); } @@ -120,28 +135,4 @@ private WxMaDefaultConfigImpl wxMaRedisTemplateConfigStorage() { WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate); return new WxMaRedisBetterConfigImpl(redisOps, wxMaProperties.getConfigStorage().getKeyPrefix()); } - - private JedisPool getJedisPool() { - ConfigStorage storage = wxMaProperties.getConfigStorage(); - RedisProperties redis = storage.getRedis(); - - JedisPoolConfig config = new JedisPoolConfig(); - if (redis.getMaxActive() != null) { - config.setMaxTotal(redis.getMaxActive()); - } - if (redis.getMaxIdle() != null) { - config.setMaxIdle(redis.getMaxIdle()); - } - if (redis.getMaxWaitMillis() != null) { - config.setMaxWaitMillis(redis.getMaxWaitMillis()); - } - if (redis.getMinIdle() != null) { - config.setMinIdle(redis.getMinIdle()); - } - config.setTestOnBorrow(true); - config.setTestWhileIdle(true); - - return new JedisPool(config, redis.getHost(), redis.getPort(), redis.getTimeout(), redis.getPassword(), - redis.getDatabase()); - } } diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/ConfigStorage.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/ConfigStorage.java deleted file mode 100644 index 921075d1d3..0000000000 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/ConfigStorage.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.binarywang.spring.starter.wxjava.miniapp.properties; - -import com.binarywang.spring.starter.wxjava.miniapp.enums.HttpClientType; -import com.binarywang.spring.starter.wxjava.miniapp.enums.StorageType; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * 存储策略. - * - * @author Binary Wang - * @date 2020-05-25 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -public class ConfigStorage implements Serializable { - private static final long serialVersionUID = 4815731027000065434L; - - /** - * 存储类型. - */ - private StorageType type = StorageType.Memory; - - /** - * 指定key前缀. - */ - private String keyPrefix = "wa"; - - /** - * redis连接配置. - */ - private RedisProperties redis; - - /** - * http客户端类型. - */ - private HttpClientType httpClientType = HttpClientType.HttpClient; - - /** - * http代理主机. - */ - private String httpProxyHost; - - /** - * http代理端口. - */ - private Integer httpProxyPort; - - /** - * http代理用户名. - */ - private String httpProxyUsername; - - /** - * http代理密码. - */ - private String httpProxyPassword; - -} diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/RedisProperties.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/RedisProperties.java deleted file mode 100644 index 5e630c727f..0000000000 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/RedisProperties.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.binarywang.spring.starter.wxjava.miniapp.properties; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * redis配置. - * - * @author Binary Wang - * @date 2020-05-25 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -public class RedisProperties implements Serializable { - private static final long serialVersionUID = -5924815351660074401L; - - /** - * 主机地址. - */ - private String host; - - /** - * 端口号. - */ - private int port = 6379; - - /** - * 密码. - */ - private String password; - - /** - * 超时. - */ - private int timeout = 2000; - - /** - * 数据库. - */ - private int database = 0; - - private Integer maxActive; - private Integer maxIdle; - private Integer maxWaitMillis; - private Integer minIdle; -} diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/WxMaProperties.java b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/WxMaProperties.java index 0bf267d6c5..0139215ea7 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/WxMaProperties.java +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/miniapp/properties/WxMaProperties.java @@ -1,5 +1,7 @@ package com.binarywang.spring.starter.wxjava.miniapp.properties; +import com.binarywang.spring.starter.wxjava.miniapp.enums.HttpClientType; +import com.binarywang.spring.starter.wxjava.miniapp.enums.StorageType; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -40,6 +42,83 @@ public class WxMaProperties { /** * 存储策略 */ - private ConfigStorage configStorage = new ConfigStorage(); + private final ConfigStorage configStorage = new ConfigStorage(); + @Data + public static class ConfigStorage { + + /** + * 存储类型. + */ + private StorageType type = StorageType.Memory; + + /** + * 指定key前缀. + */ + private String keyPrefix = "wa"; + + /** + * redis连接配置. + */ + private final RedisProperties redis = new RedisProperties(); + + /** + * http客户端类型. + */ + private HttpClientType httpClientType = HttpClientType.HttpClient; + + /** + * http代理主机. + */ + private String httpProxyHost; + + /** + * http代理端口. + */ + private Integer httpProxyPort; + + /** + * http代理用户名. + */ + private String httpProxyUsername; + + /** + * http代理密码. + */ + private String httpProxyPassword; + } + + @Data + public static class RedisProperties { + + /** + * 主机地址.不填则从spring容器内获取JedisPool + */ + private String host; + + /** + * 端口号. + */ + private int port = 6379; + + /** + * 密码. + */ + private String password; + + /** + * 超时. + */ + private int timeout = 2000; + + /** + * 数据库. + */ + private int database = 0; + + private Integer maxActive; + private Integer maxIdle; + private Integer maxWaitMillis; + private Integer minIdle; + } } From ba33c9a728d64b117841bacede6cebe326a87237 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 19 Jun 2020 00:09:03 +0800 Subject: [PATCH 32/90] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=203.8.3.B?= =?UTF-8?q?=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 +- 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 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index d22e4db372..ecd08ae5d7 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.8.2.B + 3.8.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 5d3397d1fe..73b578d5f5 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.2.B + 3.8.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 2564573682..066d73409d 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.2.B + 3.8.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 2e7e56d639..93b164ded5 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.2.B + 3.8.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 a6eda56553..6cb5dcee10 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.2.B + 3.8.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 787db5a14d..f7d46d4f33 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.2.B + 3.8.3.B 4.0.0 diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml index 6ae6b19883..c0570ad9f2 100644 --- a/weixin-graal/pom.xml +++ b/weixin-graal/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.2.B + 3.8.3.B weixin-graal diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index a3a35a461c..645d510126 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.2.B + 3.8.3.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 11854b3c81..16785cd1d0 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.2.B + 3.8.3.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index f753e02342..e6c4858bd2 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.2.B + 3.8.3.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 66f744313e..555309038c 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.2.B + 3.8.3.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 4c0d6ec720..719ea23e52 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.2.B + 3.8.3.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 506f5025ff..b14258ed0a 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.8.2.B + 3.8.3.B 4.0.0 From 4d44398d7a44c9fc015374cd83587f1a5f6dd87b Mon Sep 17 00:00:00 2001 From: taneg <30307000+taneg@users.noreply.github.com> Date: Tue, 30 Jun 2020 10:45:27 +0800 Subject: [PATCH 33/90] =?UTF-8?q?:bug:=20#1649=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=9B=B4=E6=92=AD=E9=97=B4=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8E=A5=E5=8F=A3=E5=87=BA=E7=8E=B0=20require=20https?= =?UTF-8?q?=20hints=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java index 8a39e2957b..ee7da797d4 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java @@ -14,7 +14,7 @@ * @author yjwang */ public interface WxMaLiveService { - String GET_LIVE_INFO = "http://api.weixin.qq.com/wxa/business/getliveinfo"; + String GET_LIVE_INFO = "https://api.weixin.qq.com/wxa/business/getliveinfo"; /** * 获取直播房间列表.(分页) From eec3f78ec695a20e20d882eaebd28df58267f65b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AA=97=E5=A4=96=E6=9C=88=E5=85=89?= <275825377@qq.com> Date: Tue, 30 Jun 2020 11:01:01 +0800 Subject: [PATCH 34/90] =?UTF-8?q?:bug:=20#1653=20=E4=BF=AE=E5=A4=8DSDK?= =?UTF-8?q?=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95=E7=AD=BE=E5=90=8D=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E8=8E=B7=E5=8F=96=20Ticket=E6=97=B6=E7=9A=84type?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: CharismaYU --- .../main/java/me/chanjar/weixin/common/enums/TicketType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/enums/TicketType.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/enums/TicketType.java index 95bcffe857..afbd1ec382 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/enums/TicketType.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/enums/TicketType.java @@ -21,7 +21,7 @@ public enum TicketType { /** * sdk */ - SDK("sdk"), + SDK("2"), /** * 微信卡券 */ From c60fda48d218da7d4437744c0c22551c047dc0a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E5=90=8C=E7=A7=91=E6=8A=80?= <30375770+lipengjun92@users.noreply.github.com> Date: Tue, 30 Jun 2020 16:32:50 +0800 Subject: [PATCH 35/90] =?UTF-8?q?:new:=20#1651=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=9B=B4=E6=92=AD=E9=97=B4=E5=95=86?= =?UTF-8?q?=E5=93=81=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: lipengjun --- .../wx/miniapp/api/WxMaLiveGoodsService.java | 123 ++++++++++++++++ .../wx/miniapp/api/WxMaLiveService.java | 58 ++++++-- .../wx/miniapp/api/WxMaMaterialService.java | 46 ++++++ .../wx/miniapp/api/WxMaService.java | 14 ++ .../miniapp/api/impl/BaseWxMaServiceImpl.java | 12 ++ .../api/impl/WxMaLiveGoodsServiceImpl.java | 132 ++++++++++++++++++ .../miniapp/api/impl/WxMaLiveServiceImpl.java | 46 ++++-- .../api/impl/WxMaMaterialServiceImpl.java | 28 ++++ .../wx/miniapp/bean/WxMaLiveInfo.java | 60 ++++++++ ...MaGetLiveInfo.java => WxMaLiveResult.java} | 77 +++++++--- .../impl/WxMaLiveGoodsServiceImplTest.java | 92 ++++++++++++ .../api/impl/WxMaLiveServiceImplTest.java | 52 +++++-- 12 files changed, 681 insertions(+), 59 deletions(-) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveGoodsService.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMaterialService.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMaterialServiceImpl.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveInfo.java rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/{WxMaGetLiveInfo.java => WxMaLiveResult.java} (55%) create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java 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 new file mode 100644 index 0000000000..f52f9efde2 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveGoodsService.java @@ -0,0 +1,123 @@ +package cn.binarywang.wx.miniapp.api; + +import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo; +import cn.binarywang.wx.miniapp.bean.WxMaLiveResult; +import me.chanjar.weixin.common.error.WxErrorException; + +import java.util.List; + +/** + *
+ * 直播间商品相关操作接口
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/liveplayer/commodity-api.html
+ * Created by lipengjun on 2020/6/29.
+ * 
+ * + * @author lipengjun (939961241@qq.com) + */ +public interface WxMaLiveGoodsService { + String ADD_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/add"; + String RESET_AUDIT_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/resetaudit"; + String AUDIT_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/audit"; + String DELETE_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/delete"; + String UPDATE_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/update"; + String GET_GOODS_WARE_HOUSE = "https://api.weixin.qq.com/wxa/business/getgoodswarehouse"; + String GET_APPROVED_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/getapproved"; + + /** + * 商品添加并提审 + *
+   * 调用此接口上传并提审需要直播的商品信息,审核通过后商品录入【小程序直播】商品库
+   * 注意:开发者必须保存【商品ID】与【审核单ID】,如果丢失,则无法调用其他相关接口
+   * 调用额度:500次/一天
+   * http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=ACCESS_TOKEN
+   * 
+ * + * @param goods 商品 + * @return 返回auditId、goodsId + * @throws WxErrorException . + */ + WxMaLiveResult addGoods(WxMaLiveInfo.Goods goods) throws WxErrorException; + + /** + * 撤回审核 + *
+   * 调用此接口,可撤回直播商品的提审申请,消耗的提审次数不返还
+   * 调用额度:500次/一天
+   * http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/resetaudit?access_token=ACCESS_TOKEN
+   * 
+   * @param auditId 审核单ID
+   * @param goodsId 商品ID
+   * @return 撤回审核是否成功
+   * @throws WxErrorException .
+   */
+  boolean resetAudit(Integer auditId, Integer goodsId) throws WxErrorException;
+
+  /**
+   * 重新提交审核
+   * 
+   * 调用此接口,可撤回直播商品的提审申请,消耗的提审次数不返还
+   * 调用额度:500次/一天(与接口'商品添加并提审'共用500次限制)
+   * http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/audit?access_token=ACCESS_TOKEN
+   * 
+   * @param goodsId 商品ID
+   * @return 审核单ID
+   * @throws WxErrorException .
+   */
+  String auditGoods(Integer goodsId) throws WxErrorException;
+
+  /**
+   * 删除商品
+   * 
+   * 调用此接口,可删除【小程序直播】商品库中的商品,删除后直播间上架的该商品也将被同步删除,不可恢复;
+   * 调用额度:1000次/一天
+   * http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=ACCESS_TOKEN
+   * 
+   * @param goodsId 商品ID
+   * @return 删除商品是否成功
+   * @throws WxErrorException .
+   */
+  boolean deleteGoods(Integer goodsId) throws WxErrorException;
+
+  /**
+   * 更新商品
+   * 
+   * 调用此接口可以更新商品信息,审核通过的商品仅允许更新价格类型与价格,审核中的商品不允许更新,未审核的商品允许更新所有字段, 只传入需要更新的字段。
+   * 调用额度:1000次/一天
+   * http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/update?access_token=ACCESS_TOKEN
+   * 
+ * + * @param goods 商品 + * @return 更新商品是否成功 + * @throws WxErrorException . + */ + boolean updateGoods(WxMaLiveInfo.Goods goods) throws WxErrorException; + + /** + * 获取商品状态 + *
+   * 调用此接口可获取商品的信息与审核状态
+   * 调用额度:1000次/一天
+   * http请求方式:POST https://api.weixin.qq.com/wxa/business/getgoodswarehouse?access_token=ACCESS_TOKEN
+   * 
+   * @param goodsIds 商品ID集
+   * @return 商品状态信息
+   * @throws WxErrorException .
+   */
+  WxMaLiveResult getGoodsWareHouse(List goodsIds) throws WxErrorException;
+
+  /**
+   * 获取商品列表
+   * 
+   * 调用此接口可获取商品列表
+   * 调用额度:10000次/一天
+   * http请求方式:GET https://api.weixin.qq.com/wxaapi/broadcast/goods/getapproved?access_token=ACCESS_TOKEN
+   * 
+   * @param offset 分页条数起点
+   * @param limit  分页大小,默认30,不超过100
+   * @param status 商品状态,0:未审核。1:审核中,2:审核通过,3:审核驳回
+   * @return 商品列表
+   * @throws WxErrorException .
+   */
+  WxMaLiveResult getApprovedGoods(Integer offset, Integer limit, Integer status) throws WxErrorException;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java
index ee7da797d4..01883481cf 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java
@@ -1,6 +1,7 @@
 package cn.binarywang.wx.miniapp.api;
 
-import cn.binarywang.wx.miniapp.bean.WxMaGetLiveInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
 import me.chanjar.weixin.common.error.WxErrorException;
 
 import java.util.List;
@@ -15,6 +16,22 @@
  */
 public interface WxMaLiveService {
   String GET_LIVE_INFO = "https://api.weixin.qq.com/wxa/business/getliveinfo";
+  String CREATE_ROOM = "https://api.weixin.qq.com/wxaapi/broadcast/room/create";
+  String ADD_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods";
+
+  /**
+   * 创建直播间
+   * 
+   * 调用此接口创建直播间,创建成功后将在直播间列表展示,调用额度:10000次/一天
+   * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/liveplayer/studio-api.html#1
+   * http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/room/create?access_token=ACCESS_TOKEN
+   * 
+ * + * @param roomInfo 直播间信息 + * @return . + * @throws WxErrorException . + */ + Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorException; /** * 获取直播房间列表.(分页) @@ -24,39 +41,54 @@ public interface WxMaLiveService { * @return . * @throws WxErrorException . */ - WxMaGetLiveInfo getLiveInfo(Integer start, Integer limit) throws WxErrorException; + WxMaLiveResult getLiveInfo(Integer start, Integer limit) throws WxErrorException; /** * 获取所有直播间信息(没有分页直接获取全部) + * * @return * @throws WxErrorException */ - List getLiveinfos() throws WxErrorException; + List getLiveinfos() throws WxErrorException; /** - * * 获取直播房间回放数据信息. * - * @param action 获取回放 + * @param action 获取回放 * @param room_id 直播间 id - * @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取 - * @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内 + * @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取 + * @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内 * @return * @throws WxErrorException */ - WxMaGetLiveInfo getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException; + WxMaLiveResult getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException; /** - * * 获取直播房间回放数据信息. + *

+ * 获取回放 (默认:get_replay) * - * 获取回放 (默认:get_replay) * @param room_id 直播间 id - * @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取 - * @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内 + * @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取 + * @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内 * @return * @throws WxErrorException */ - WxMaGetLiveInfo getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException; + WxMaLiveResult getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException; + /** + * 直播间导入商品 + *

+ * 调用接口往指定直播间导入已入库的商品 + * 调用频率 + * 调用额度:10000次/一天 + *

+ * http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods?access_token=ACCESS_TOKEN + *

+   * @param roomId 房间ID
+   * @param goodsIds 数组列表,可传入多个,里面填写 商品 ID
+   * @return 导入商品是否成功
+   * @throws WxErrorException .
+   */
+  boolean addGoodsToRoom(Integer roomId, List goodsIds) throws WxErrorException;
 }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMaterialService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMaterialService.java
new file mode 100644
index 0000000000..7c9b9e21a0
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMaterialService.java
@@ -0,0 +1,46 @@
+package cn.binarywang.wx.miniapp.api;
+
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+import java.io.File;
+
+/**
+ * 
+ * 素材管理的相关接口
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html
+ * Created by lipengjun on 2020/6/29.
+ * 
+ * + * @author lipengjun (939961241@qq.com) + */ +public interface WxMaMaterialService { + String MEDIA_UPLOAD_URL = "https://api.weixin.qq.com/cgi-bin/media/upload?type=%s"; + /** + *
+   * 新增临时素材
+   * 小程序获取临时素材,用于直播间商品
+   * 素材管理接口对所有认证的订阅号和服务号开放。通过本接口,小程序可以新增临时素材(即上传临时多媒体文件),返回的mediaId用于直播间商品使用。
+   * 请注意:
+   *  1、对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(所以用户发送给开发者的素材,若开发者需要,应尽快下载到本地),以节省服务器资源。
+   *  2、media_id是可复用的。
+   *  3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/amr格式
+   *  4、需使用https调用本接口。
+   *  本接口即为原“上传多媒体文件”接口。
+   *  注意事项:
+   *    上传的临时多媒体文件有格式和大小限制,如下:
+   *    图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
+   *    语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
+   *    视频(video):10MB,支持MP4格式
+   *    缩略图(thumb):64KB,支持JPG格式
+   * 媒体文件在后台保存时间为3天,即3天后media_id失效。
+   * 详情请见: 新增临时素材
+   * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
+   * 
+ * + * @param mediaType 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts} + * @param file 文件对象 + * @throws WxErrorException + */ + WxMediaUploadResult mediaUpload(String mediaType, File file) 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 875d9430d4..caac54388b 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 @@ -280,4 +280,18 @@ public interface WxMaService extends WxService { * @return . */ WxMaLiveService getLiveService(); + + /** + * 获取直播间商品服务对象 + * + * @return . + */ + WxMaLiveGoodsService getLiveGoodsService(); + + /** + * 获取小程序素材管理服务对象 + * + * @return . + */ + WxMaMaterialService getMaterialService(); } 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 ee891ecb7b..34581ad804 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 @@ -56,6 +56,8 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH private final WxMaSubscribeService subscribeService = new WxMaSubscribeServiceImpl(this); private final WxMaCloudService cloudService = new WxMaCloudServiceImpl(this); private final WxMaLiveService liveService = new WxMaLiveServiceImpl(this); + private final WxMaLiveGoodsService liveGoodsService = new WxMaLiveGoodsServiceImpl(this); + private final WxMaMaterialService maMaterialService = new WxMaMaterialServiceImpl(this); private int retrySleepMillis = 1000; private int maxRetryTimes = 5; @@ -394,4 +396,14 @@ public WxMaCloudService getCloudService() { public WxMaLiveService getLiveService() { return this.liveService; } + + @Override + public WxMaLiveGoodsService getLiveGoodsService() { + return this.liveGoodsService; + } + + @Override + public WxMaMaterialService getMaterialService() { + return this.maMaterialService; + } } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java new file mode 100644 index 0000000000..f20e0fc288 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java @@ -0,0 +1,132 @@ +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaLiveGoodsService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo; +import cn.binarywang.wx.miniapp.bean.WxMaLiveResult; +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableMap; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.WxType; +import me.chanjar.weixin.common.error.WxError; +import me.chanjar.weixin.common.error.WxErrorException; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *
+ *  Created by lipengjun on 2020/6/29.
+ * 
+ * + * @author lipengjun (939961241@qq.com) + */ +@AllArgsConstructor +public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService { + private static final JsonParser JSON_PARSER = new JsonParser(); + + private WxMaService wxMaService; + + @Override + public WxMaLiveResult addGoods(WxMaLiveInfo.Goods goods) throws WxErrorException { + Map map = new HashMap<>(2); + map.put("goodsInfo", goods); + String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return WxMaLiveResult.fromJson(jsonObject.toString()); + } + + @Override + public boolean resetAudit(Integer auditId, Integer goodsId) throws WxErrorException { + Map map = new HashMap<>(4); + map.put("auditId", auditId); + map.put("goodsId", goodsId); + String responseContent = this.wxMaService.post(RESET_AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return true; + } + + @Override + public String auditGoods(Integer goodsId) throws WxErrorException { + Map map = new HashMap<>(2); + map.put("goodsId", goodsId); + String responseContent = this.wxMaService.post(AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return jsonObject.get("auditId").getAsString(); + } + + @Override + public boolean deleteGoods(Integer goodsId) throws WxErrorException { + Map map = new HashMap<>(2); + map.put("goodsId", goodsId); + String responseContent = this.wxMaService.post(DELETE_GOODS, WxMaGsonBuilder.create().toJson(map)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return true; + } + + @Override + public boolean updateGoods(WxMaLiveInfo.Goods goods) throws WxErrorException { + Map map = new HashMap<>(2); + map.put("goodsInfo", goods); + String responseContent = this.wxMaService.post(UPDATE_GOODS, WxMaGsonBuilder.create().toJson(map)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return true; + } + + @Override + public WxMaLiveResult getGoodsWareHouse(List goodsIds) throws WxErrorException { + Map map = new HashMap<>(2); + map.put("goods_ids", goodsIds); + String responseContent = this.wxMaService.post(GET_GOODS_WARE_HOUSE, WxMaGsonBuilder.create().toJson(map)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return WxMaLiveResult.fromJson(jsonObject.toString()); + } + + @Override + public WxMaLiveResult getApprovedGoods(Integer offset, Integer limit, Integer status) throws WxErrorException { + ImmutableMap params = ImmutableMap.of("status", status, "offset", offset, "limit", limit); + String responseContent = wxMaService.get(GET_APPROVED_GOODS, Joiner.on("&").withKeyValueSeparator("=").join(params)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + JsonArray goodsArr = jsonObject.getAsJsonArray("goods"); + if (goodsArr.size() > 0) { + for (int i = 0; i < goodsArr.size(); i++) { + // 接口返回key是驼峰 + JsonObject goods = (JsonObject) goodsArr.get(i); + goods.addProperty("goods_id", goods.get("goodsId").getAsInt()); + goods.addProperty("cover_img_url", goods.get("coverImgUrl").getAsString()); + goods.addProperty("price_type", goods.get("priceType").getAsInt()); + goods.addProperty("third_party_tag", goods.get("thirdPartyTag").getAsInt()); + goods.addProperty("audit_status", status); + } + } + return WxMaLiveResult.fromJson(jsonObject.toString()); + } + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java index 6f1a154bb1..41c7d60878 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java @@ -2,7 +2,8 @@ import cn.binarywang.wx.miniapp.api.WxMaLiveService; import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaGetLiveInfo; +import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo; +import cn.binarywang.wx.miniapp.bean.WxMaLiveResult; import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -26,21 +27,31 @@ @AllArgsConstructor public class WxMaLiveServiceImpl implements WxMaLiveService { private static final JsonParser JSON_PARSER = new JsonParser(); - private WxMaService service; + private WxMaService wxMaService; @Override - public WxMaGetLiveInfo getLiveInfo(Integer start, Integer limit) throws WxErrorException { + public Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorException { + String responseContent = this.wxMaService.post(CREATE_ROOM, WxMaGsonBuilder.create().toJson(roomInfo)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return jsonObject.get("roomId").getAsInt(); + } + + @Override + public WxMaLiveResult getLiveInfo(Integer start, Integer limit) throws WxErrorException { JsonObject jsonObject = getJsonObject(start, limit, null); - return WxMaGetLiveInfo.fromJson(jsonObject.toString()); + return WxMaLiveResult.fromJson(jsonObject.toString()); } @Override - public List getLiveinfos() throws WxErrorException { - List results = new ArrayList<>(); + public List getLiveinfos() throws WxErrorException { + List results = new ArrayList<>(); Integer start = 0; Integer limit = 80; Integer tatal = 0; - WxMaGetLiveInfo liveInfo = null; + WxMaLiveResult liveInfo = null; do { if (tatal != 0 && tatal <= start) { break; @@ -62,19 +73,32 @@ public List getLiveinfos() throws WxErrorException { } @Override - public WxMaGetLiveInfo getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException { + public WxMaLiveResult getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException { Map map = new HashMap(4); map.put("action", action); map.put("room_id", room_id); JsonObject jsonObject = getJsonObject(start, limit, map); - return WxMaGetLiveInfo.fromJson(jsonObject.toString()); + return WxMaLiveResult.fromJson(jsonObject.toString()); } @Override - public WxMaGetLiveInfo getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException { + public WxMaLiveResult getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException { return getLiveReplay("get_replay", room_id, start, limit); } + @Override + public boolean addGoodsToRoom(Integer roomId, List goodsIds) throws WxErrorException { + Map map = new HashMap<>(2); + map.put("roomId", roomId); + map.put("ids", goodsIds); + String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map)); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + return true; + } + /** * 包装一下 * @@ -90,7 +114,7 @@ private JsonObject getJsonObject(Integer start, Integer limit, Map + * Created by lipengjun on 2020/6/29. + *
+ * + * @author lipengjun (939961241@qq.com) + */ +@RequiredArgsConstructor +public class WxMaMaterialServiceImpl implements WxMaMaterialService { + private final WxMaService wxMaService; + + @Override + public WxMediaUploadResult mediaUpload(String mediaType, File file) throws WxErrorException { + String url = String.format(MEDIA_UPLOAD_URL, mediaType); + return this.wxMaService.execute(MediaUploadRequestExecutor.create(this.wxMaService.getRequestHttp()), url, file); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveInfo.java new file mode 100644 index 0000000000..8a98b4a218 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveInfo.java @@ -0,0 +1,60 @@ +package cn.binarywang.wx.miniapp.bean; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 直播接口入参 + * + * @author yjwang + * @date 2020/4/5 + */ +@Data +public class WxMaLiveInfo implements Serializable { + private static final long serialVersionUID = 7285263767524755887L; + + /** + * 直播列表 + */ + @Data + public static class RoomInfo implements Serializable { + private static final long serialVersionUID = 7745775280267417154L; + private String name; + private Integer roomid; + private String coverImg; + private String shareImg; + private Integer liveStatus; + private Long startTime; + private Long endTime; + private String anchorName; + private String anchorWechat; + private String anchorImg; + private Integer type; + private Integer screenType; + private Integer closeLike; + private Integer closeGoods; + private Integer closeComment; + private List goods; + } + + /** + * 商品列表 + */ + @Data + public static class Goods implements Serializable { + private static final long serialVersionUID = 5769245932149287574L; + private Integer goodsId; + private String coverImgUrl; + private String url; + private Integer priceType; + private String price; + private String price2; + private String name; + /** + * 1, 2:表示是为api添加商品,否则是在MP添加商品 + */ + private String thirdPartyTag; + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaGetLiveInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveResult.java similarity index 55% rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaGetLiveInfo.java rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveResult.java index 77817d3cec..2b0407e6aa 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaGetLiveInfo.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveResult.java @@ -8,30 +8,65 @@ import java.util.List; /** - * 获取直播房间列表 + *
+ * 直播间操作返回结果
+ * Created by lipengjun on 2020/6/29.
+ * 
* - * @author yjwang - * @date 2020/4/5 + * @author lipengjun (939961241@qq.com) */ @Data -public class WxMaGetLiveInfo implements Serializable { - private static final long serialVersionUID = 7285263767524755887L; +public class WxMaLiveResult implements Serializable { + private static final long serialVersionUID = 1L; private Integer errcode; private String errmsg; private Integer total; + private Integer auditId; + private Integer goodsId; + private List goods; + /** * 直播间列表 */ @SerializedName("room_info") private List roomInfos; + /** * 获取回放源视频列表 */ @SerializedName("live_replay") private List liveReplay; - public static WxMaGetLiveInfo fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaGetLiveInfo.class); + public static WxMaLiveResult fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaLiveResult.class); + } + + /** + * 商品列表 + */ + @Data + public static class Goods implements Serializable { + private static final long serialVersionUID = 5769245932149287574L; + @SerializedName("goods_id") + private Integer goodsId; + @SerializedName("cover_img_url") + private String coverImgUrl; + private String name; + private String url; + @SerializedName("price_type") + private Integer priceType; + /** + * 0:未审核,1:审核中,2:审核通过,3审核失败 + */ + @SerializedName("audit_status") + private Integer auditStatus; + private String price; + private String price2; + /** + * 1, 2:表示是为api添加商品,否则是在MP添加商品 + */ + @SerializedName("third_party_tag") + private String thirdPartyTag; } /** @@ -54,22 +89,20 @@ public static class RoomInfo implements Serializable { private Long endTime; @SerializedName("anchor_name") private String anchorName; + @SerializedName("anchor_wechat") + private String anchorWechat; @SerializedName("anchor_img") private String anchorImg; - private List goods; - } - - /** - * 商品列表 - */ - @Data - public static class Goods implements Serializable { - private static final long serialVersionUID = 5769245932149287574L; - @SerializedName("cover_img") - private String coverImg; - private String url; - private String price; - private String name; + private Integer type; + @SerializedName("screen_type") + private Integer screenType; + @SerializedName("close_like") + private Integer closeLike; + @SerializedName("closeGoods") + private Integer closeGoods; + @SerializedName("close_comment") + private Integer closeComment; + private List goods; } /** @@ -85,6 +118,4 @@ public static class LiveReplay implements Serializable { @SerializedName("media_url") private String mediaUrl; } - - } 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 new file mode 100644 index 0000000000..25e92efdcd --- /dev/null +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java @@ -0,0 +1,92 @@ +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo; +import cn.binarywang.wx.miniapp.bean.WxMaLiveResult; +import cn.binarywang.wx.miniapp.test.ApiTestModule; +import com.google.inject.Inject; +import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.Arrays; + +import static org.testng.Assert.assertNotNull; + +/** + * 测试直播商品管理相关的接口 + * + * @author lipengjun (939961241@qq.com) + */ +@Test +@Guice(modules = ApiTestModule.class) +public class WxMaLiveGoodsServiceImplTest { + + @Inject + private WxMaService wxService; + + @Test + public void addGoods() throws Exception { + //上传临时素材 + WxMediaUploadResult mediaUpload = this.wxService.getMaterialService().mediaUpload("image", new File("E:\\1.png")); + + WxMaLiveInfo.Goods goods = new WxMaLiveInfo.Goods(); + goods.setCoverImgUrl(mediaUpload.getMediaId()); + goods.setName("宫廷奢华真丝四件套"); + goods.setPrice("1599"); + goods.setPrice2("0"); + goods.setPriceType(1); + goods.setUrl("pages/goods/goods?id=b7c4fbf95493bd294054fe4296d0d9ad"); + WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().addGoods(goods); + assertNotNull(liveResult); + System.out.println(liveResult.toString()); + } + + @Test + public void resetAudit() throws Exception { + boolean result = this.wxService.getLiveGoodsService().resetAudit(715138516, 9); + System.out.println(result); + } + + @Test + public void auditGoods() throws Exception { + String result = this.wxService.getLiveGoodsService().auditGoods(9); + System.out.println(result); + } + + @Test + public void deleteGoods() throws Exception { + boolean result = this.wxService.getLiveGoodsService().deleteGoods(9); + System.out.println(result); + } + + @Test + public void updateGoods() throws Exception { + + WxMaLiveInfo.Goods goods = new WxMaLiveInfo.Goods(); + goods.setGoodsId(8); + goods.setName("宫廷奢华真丝四件套"); + goods.setCoverImgUrl("http://mmbiz.qpic.cn/mmbiz_png/omYktZNGamuUQE0WPVfqdnLV61JDhluXOac7PiaoZeticFpcR7wvicC0aXUC2VXkl7r1gN0QSKosv2satn6oCFeiaQ/0"); + goods.setPrice("2299"); + goods.setPrice2("0"); + goods.setPriceType(1); + goods.setUrl("pages/goods/goods?id=b7c4fbf95493bd294054fe4296d0d9ad"); + boolean maLiveInfo = this.wxService.getLiveGoodsService().updateGoods(goods); + System.out.println(maLiveInfo); + } + + @Test + public void getGoodsWareHouse() throws Exception { + WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().getGoodsWareHouse(Arrays.asList(1, 2)); + assertNotNull(liveResult); + System.out.println(liveResult.toString()); + } + + @Test + public void getApprovedGoods() throws Exception { + WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().getApprovedGoods(0, 4, 2); + assertNotNull(liveResult); + System.out.println(liveResult.toString()); + } +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java index 5ccd16a037..b6e5c9be64 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java @@ -1,23 +1,20 @@ package cn.binarywang.wx.miniapp.api.impl; import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaGetLiveInfo; -import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; -import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; +import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo; +import cn.binarywang.wx.miniapp.bean.WxMaLiveResult; import cn.binarywang.wx.miniapp.test.ApiTestModule; -import cn.binarywang.wx.miniapp.test.TestConfig; -import com.google.common.collect.ImmutableMap; -import com.google.gson.JsonObject; import com.google.inject.Inject; -import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import java.io.File; +import java.util.Arrays; +import java.util.Calendar; import java.util.List; -import java.util.stream.Collectors; import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; /** * 测试直播相关的接口 @@ -31,9 +28,34 @@ public class WxMaLiveServiceImplTest { @Inject private WxMaService wxService; + @Test + public void createRoom() throws Exception { + //上传临时素材 + WxMediaUploadResult mediaUpload = this.wxService.getMaterialService().mediaUpload("image", new File("E:\\1.png")); + + WxMaLiveInfo.RoomInfo roomInfo = new WxMaLiveInfo.RoomInfo(); + roomInfo.setName("订阅通知直播间"); + roomInfo.setCoverImg(mediaUpload.getMediaId()); + Calendar c = Calendar.getInstance(); + c.set(2020, Calendar.SEPTEMBER, 10, 8, 0); + roomInfo.setStartTime(c.getTimeInMillis() / 1000); + c.set(2020, Calendar.SEPTEMBER, 10, 12, 0); + roomInfo.setEndTime(c.getTimeInMillis() / 1000); + roomInfo.setAnchorName("鹏军_专业小程序开发"); + roomInfo.setAnchorWechat("pengjun939961241"); + roomInfo.setShareImg(mediaUpload.getMediaId()); + roomInfo.setType(1); + roomInfo.setScreenType(1); + roomInfo.setCloseLike(0); + roomInfo.setCloseGoods(0); + roomInfo.setCloseComment(0); + Integer roomId = this.wxService.getLiveService().createRoom(roomInfo); + System.out.println(roomId); + } + @Test public void getLiveInfo() throws Exception { - WxMaGetLiveInfo list = this.wxService.getLiveService().getLiveInfo(0,10); + WxMaLiveResult list = this.wxService.getLiveService().getLiveInfo(0, 10); assertNotNull(list); System.out.println(list.toString()); } @@ -41,15 +63,21 @@ public void getLiveInfo() throws Exception { @Test public void getLiveReplay() throws Exception { // [12, 11, 10, 9, 8, 7, 6, 5, 3, 2] - WxMaGetLiveInfo list = this.wxService.getLiveService().getLiveReplay(11,0,10); + WxMaLiveResult list = this.wxService.getLiveService().getLiveReplay(3, 0, 10); assertNotNull(list); System.out.println(list.toString()); } @Test public void getLiveinfos() throws Exception { - List list = this.wxService.getLiveService().getLiveinfos(); + List list = this.wxService.getLiveService().getLiveinfos(); assertNotNull(list); System.out.println(list.toString()); } + + @Test + public void addGoodsToRoom() throws Exception { + boolean result = this.wxService.getLiveService().addGoodsToRoom(5, Arrays.asList(8, 7, 5, 4, 10)); + System.out.println(result); + } } From a00d67a58a56dfa9127d1bca577f8a6590a330e4 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 30 Jun 2020 16:54:40 +0800 Subject: [PATCH 36/90] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E8=A7=84?= =?UTF-8?q?=E8=8C=83=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/constant/WxCpApiPathConsts.java | 2 +- .../wx/miniapp/api/WxMaLiveService.java | 32 ++++++------- .../miniapp/api/impl/WxMaLiveServiceImpl.java | 48 ++++++++----------- .../api/impl/WxMaLiveServiceImplTest.java | 2 +- 4 files changed, 39 insertions(+), 45 deletions(-) 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 f10a4dd124..9b465fd0c5 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 @@ -70,7 +70,7 @@ public static class Oa { @Deprecated public static final String GET_APPROVAL_DATA = "/cgi-bin/corp/getapprovaldata"; public static final String GET_TEMPLATE_DETAIL = "/cgi-bin/oa/gettemplatedetail"; - public static final String APPLY_EVENT="/cgi-bin/oa/applyevent"; + public static final String APPLY_EVENT = "/cgi-bin/oa/applyevent"; } public static class Tag { diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java index 01883481cf..185085478e 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveService.java @@ -46,35 +46,35 @@ public interface WxMaLiveService { /** * 获取所有直播间信息(没有分页直接获取全部) * - * @return - * @throws WxErrorException + * @return . + * @throws WxErrorException . */ - List getLiveinfos() throws WxErrorException; + List getLiveInfos() throws WxErrorException; /** * 获取直播房间回放数据信息. * - * @param action 获取回放 - * @param room_id 直播间 id - * @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取 - * @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内 - * @return - * @throws WxErrorException + * @param action 获取回放 + * @param roomId 直播间 id + * @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取 + * @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内 + * @return . + * @throws WxErrorException . */ - WxMaLiveResult getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException; + WxMaLiveResult getLiveReplay(String action, Integer roomId, Integer start, Integer limit) throws WxErrorException; /** * 获取直播房间回放数据信息. *

* 获取回放 (默认:get_replay) * - * @param room_id 直播间 id - * @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取 - * @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内 - * @return - * @throws WxErrorException + * @param roomId 直播间 id + * @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取 + * @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内 + * @return . + * @throws WxErrorException . */ - WxMaLiveResult getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException; + WxMaLiveResult getLiveReplay(Integer roomId, Integer start, Integer limit) throws WxErrorException; /** * 直播间导入商品 diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java index 41c7d60878..4e88577697 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java @@ -8,6 +8,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; @@ -24,10 +25,11 @@ * * @author yjwang */ +@Slf4j @AllArgsConstructor public class WxMaLiveServiceImpl implements WxMaLiveService { private static final JsonParser JSON_PARSER = new JsonParser(); - private WxMaService wxMaService; + private final WxMaService wxMaService; @Override public Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorException { @@ -41,19 +43,19 @@ public Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorExceptio @Override public WxMaLiveResult getLiveInfo(Integer start, Integer limit) throws WxErrorException { - JsonObject jsonObject = getJsonObject(start, limit, null); + JsonObject jsonObject = getLiveInfo(start, limit, null); return WxMaLiveResult.fromJson(jsonObject.toString()); } @Override - public List getLiveinfos() throws WxErrorException { + public List getLiveInfos() throws WxErrorException { List results = new ArrayList<>(); - Integer start = 0; + int start = 0; Integer limit = 80; - Integer tatal = 0; - WxMaLiveResult liveInfo = null; + Integer total = 0; + WxMaLiveResult liveInfo; do { - if (tatal != 0 && tatal <= start) { + if (total != 0 && total <= start) { break; } liveInfo = getLiveInfo(start, limit); @@ -61,29 +63,30 @@ public List getLiveinfos() throws WxErrorException { return null; } results.addAll(liveInfo.getRoomInfos()); - tatal = liveInfo.getTotal(); + total = liveInfo.getTotal(); start = results.size(); try { Thread.sleep(100); } catch (InterruptedException e) { - e.printStackTrace(); + log.error("InterruptedException", e); } - } while (results.size() <= tatal); + } while (results.size() <= total); + return results; } @Override - public WxMaLiveResult getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException { - Map map = new HashMap(4); + public WxMaLiveResult getLiveReplay(String action, Integer roomId, Integer start, Integer limit) throws WxErrorException { + Map map = new HashMap<>(4); map.put("action", action); - map.put("room_id", room_id); - JsonObject jsonObject = getJsonObject(start, limit, map); + map.put("room_id", roomId); + JsonObject jsonObject = getLiveInfo(start, limit, map); return WxMaLiveResult.fromJson(jsonObject.toString()); } @Override - public WxMaLiveResult getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException { - return getLiveReplay("get_replay", room_id, start, limit); + public WxMaLiveResult getLiveReplay(Integer roomId, Integer start, Integer limit) throws WxErrorException { + return getLiveReplay("get_replay", roomId, start, limit); } @Override @@ -99,18 +102,9 @@ public boolean addGoodsToRoom(Integer roomId, List goodsIds) throws WxE return true; } - /** - * 包装一下 - * - * @param start - * @param limit - * @param map - * @return - * @throws WxErrorException - */ - private JsonObject getJsonObject(Integer start, Integer limit, Map map) throws WxErrorException { + private JsonObject getLiveInfo(Integer start, Integer limit, Map map) throws WxErrorException { if (map == null) { - map = new HashMap(2); + map = new HashMap<>(2); } map.put("start", start); map.put("limit", limit); diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java index b6e5c9be64..39d107a346 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java @@ -70,7 +70,7 @@ public void getLiveReplay() throws Exception { @Test public void getLiveinfos() throws Exception { - List list = this.wxService.getLiveService().getLiveinfos(); + List list = this.wxService.getLiveService().getLiveInfos(); assertNotNull(list); System.out.println(list.toString()); } From 7d20aa1743756323efb6dde8fe5b643c1d01721a Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 30 Jun 2020 17:21:55 +0800 Subject: [PATCH 37/90] =?UTF-8?q?:art:=20=E6=B8=85=E7=90=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/api/WxMaMaterialService.java | 46 ------------------- .../wx/miniapp/api/WxMaMediaService.java | 11 +++-- .../wx/miniapp/api/WxMaService.java | 6 --- .../miniapp/api/impl/BaseWxMaServiceImpl.java | 5 -- .../api/impl/WxMaMaterialServiceImpl.java | 28 ----------- .../api/impl/WxMaMediaServiceImpl.java | 2 +- .../impl/WxMaLiveGoodsServiceImplTest.java | 2 +- .../api/impl/WxMaLiveServiceImplTest.java | 2 +- 8 files changed, 11 insertions(+), 91 deletions(-) delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMaterialService.java delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMaterialServiceImpl.java diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMaterialService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMaterialService.java deleted file mode 100644 index 7c9b9e21a0..0000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMaterialService.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.binarywang.wx.miniapp.api; - -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.error.WxErrorException; - -import java.io.File; - -/** - *

- * 素材管理的相关接口
- * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html
- * Created by lipengjun on 2020/6/29.
- * 
- * - * @author lipengjun (939961241@qq.com) - */ -public interface WxMaMaterialService { - String MEDIA_UPLOAD_URL = "https://api.weixin.qq.com/cgi-bin/media/upload?type=%s"; - /** - *
-   * 新增临时素材
-   * 小程序获取临时素材,用于直播间商品
-   * 素材管理接口对所有认证的订阅号和服务号开放。通过本接口,小程序可以新增临时素材(即上传临时多媒体文件),返回的mediaId用于直播间商品使用。
-   * 请注意:
-   *  1、对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(所以用户发送给开发者的素材,若开发者需要,应尽快下载到本地),以节省服务器资源。
-   *  2、media_id是可复用的。
-   *  3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/amr格式
-   *  4、需使用https调用本接口。
-   *  本接口即为原“上传多媒体文件”接口。
-   *  注意事项:
-   *    上传的临时多媒体文件有格式和大小限制,如下:
-   *    图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
-   *    语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
-   *    视频(video):10MB,支持MP4格式
-   *    缩略图(thumb):64KB,支持JPG格式
-   * 媒体文件在后台保存时间为3天,即3天后media_id失效。
-   * 详情请见: 新增临时素材
-   * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
-   * 
- * - * @param mediaType 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts} - * @param file 文件对象 - * @throws WxErrorException - */ - WxMediaUploadResult mediaUpload(String mediaType, File file) throws WxErrorException; -} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMediaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMediaService.java index d2c57ca5e4..48ebb8a101 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMediaService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMediaService.java @@ -28,7 +28,9 @@ public interface WxMaMediaService { * * @param mediaType 媒体类型, * @param file 文件对象 - * @see #uploadMedia(String, String, InputStream) + * @return the wx media upload result + * @throws WxErrorException the wx error exception + * @see #uploadMedia(String, String, InputStream) #uploadMedia(String, String, InputStream) */ WxMediaUploadResult uploadMedia(String mediaType, File file) throws WxErrorException; @@ -44,7 +46,9 @@ public interface WxMaMediaService { * @param mediaType 媒体类型 * @param fileType 文件类型 * @param inputStream 输入流 - * @see #uploadMedia(java.lang.String, java.io.File) + * @return the wx media upload result + * @throws WxErrorException the wx error exception + * @see #uploadMedia(java.lang.String, java.io.File) #uploadMedia(java.lang.String, java.io.File) */ WxMediaUploadResult uploadMedia(String mediaType, String fileType, InputStream inputStream) throws WxErrorException; @@ -58,7 +62,8 @@ public interface WxMaMediaService { *
* * @param mediaId 媒体Id - * @return 保存到本地的临时文件 + * @return 保存到本地的临时文件 media + * @throws WxErrorException the wx error exception */ File getMedia(String mediaId) 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 caac54388b..f419bfea17 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 @@ -288,10 +288,4 @@ public interface WxMaService extends WxService { */ WxMaLiveGoodsService getLiveGoodsService(); - /** - * 获取小程序素材管理服务对象 - * - * @return . - */ - WxMaMaterialService getMaterialService(); } 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 34581ad804..5a2fa22b44 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 @@ -57,7 +57,6 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH private final WxMaCloudService cloudService = new WxMaCloudServiceImpl(this); private final WxMaLiveService liveService = new WxMaLiveServiceImpl(this); private final WxMaLiveGoodsService liveGoodsService = new WxMaLiveGoodsServiceImpl(this); - private final WxMaMaterialService maMaterialService = new WxMaMaterialServiceImpl(this); private int retrySleepMillis = 1000; private int maxRetryTimes = 5; @@ -402,8 +401,4 @@ public WxMaLiveGoodsService getLiveGoodsService() { return this.liveGoodsService; } - @Override - public WxMaMaterialService getMaterialService() { - return this.maMaterialService; - } } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMaterialServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMaterialServiceImpl.java deleted file mode 100644 index 286afdadda..0000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMaterialServiceImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.binarywang.wx.miniapp.api.impl; - -import cn.binarywang.wx.miniapp.api.WxMaMaterialService; -import cn.binarywang.wx.miniapp.api.WxMaService; -import lombok.RequiredArgsConstructor; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; - -import java.io.File; - -/** - *
- *  Created by lipengjun on 2020/6/29.
- * 
- * - * @author lipengjun (939961241@qq.com) - */ -@RequiredArgsConstructor -public class WxMaMaterialServiceImpl implements WxMaMaterialService { - private final WxMaService wxMaService; - - @Override - public WxMediaUploadResult mediaUpload(String mediaType, File file) throws WxErrorException { - String url = String.format(MEDIA_UPLOAD_URL, mediaType); - return this.wxMaService.execute(MediaUploadRequestExecutor.create(this.wxMaService.getRequestHttp()), url, file); - } -} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMediaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMediaServiceImpl.java index 06a453caed..b39f50cb41 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMediaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMediaServiceImpl.java @@ -22,7 +22,7 @@ */ @AllArgsConstructor public class WxMaMediaServiceImpl implements WxMaMediaService { - private WxMaService wxMaService; + private final WxMaService wxMaService; @Override public WxMediaUploadResult uploadMedia(String mediaType, String fileType, InputStream inputStream) throws WxErrorException { 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 25e92efdcd..769d82919e 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 @@ -29,7 +29,7 @@ public class WxMaLiveGoodsServiceImplTest { @Test public void addGoods() throws Exception { //上传临时素材 - WxMediaUploadResult mediaUpload = this.wxService.getMaterialService().mediaUpload("image", new File("E:\\1.png")); + WxMediaUploadResult mediaUpload = this.wxService.getMediaService().uploadMedia("image", new File("E:\\1.png")); WxMaLiveInfo.Goods goods = new WxMaLiveInfo.Goods(); goods.setCoverImgUrl(mediaUpload.getMediaId()); diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java index 39d107a346..e92913366a 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImplTest.java @@ -31,7 +31,7 @@ public class WxMaLiveServiceImplTest { @Test public void createRoom() throws Exception { //上传临时素材 - WxMediaUploadResult mediaUpload = this.wxService.getMaterialService().mediaUpload("image", new File("E:\\1.png")); + WxMediaUploadResult mediaUpload = this.wxService.getMediaService().uploadMedia("image", new File("E:\\1.png")); WxMaLiveInfo.RoomInfo roomInfo = new WxMaLiveInfo.RoomInfo(); roomInfo.setName("订阅通知直播间"); From b75569498ca9e3f57d25fc69e09d7b99e8b09584 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 2 Jul 2020 13:47:47 +0800 Subject: [PATCH 38/90] =?UTF-8?q?:art:=20#1647=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7redis=E9=85=8D=E7=BD=AE=E6=94=AF?= =?UTF-8?q?=E6=8C=81=EF=BC=8C=E5=8E=BB=E6=8E=89=E5=AE=B9=E6=98=93=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E9=97=AE=E9=A2=98=E7=9A=84=E6=9E=84=E9=80=A0=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/config/impl/WxMpRedisConfigImpl.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java index dbb3878218..7f54eb0bb9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java @@ -1,10 +1,9 @@ package me.chanjar.weixin.mp.config.impl; import lombok.Data; -import me.chanjar.weixin.common.redis.JedisWxRedisOps; -import me.chanjar.weixin.common.redis.WxRedisOps; +import lombok.EqualsAndHashCode; import me.chanjar.weixin.common.enums.TicketType; -import redis.clients.jedis.JedisPool; +import me.chanjar.weixin.common.redis.WxRedisOps; import java.util.concurrent.TimeUnit; @@ -19,7 +18,7 @@ * @author nickwong */ @Data -@SuppressWarnings("hiding") +@EqualsAndHashCode(callSuper = false) public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl { private static final long serialVersionUID = -988502871997239733L; @@ -33,10 +32,6 @@ public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl { private String accessTokenKey; private String lockKey; - public WxMpRedisConfigImpl(JedisPool jedisPool) { - this(new JedisWxRedisOps(jedisPool), "wx"); - } - public WxMpRedisConfigImpl(WxRedisOps redisOps, String keyPrefix) { this.redisOps = redisOps; this.keyPrefix = keyPrefix; From 978ada7373f23294ce18bbd882f5101bd40d8626 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 5 Jul 2020 21:32:50 +0800 Subject: [PATCH 39/90] =?UTF-8?q?:new:=20#1527=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=A2=9E=E5=8A=A0OCR=E8=BA=AB?= =?UTF-8?q?=E4=BB=BD=E8=AF=81=E8=AF=86=E5=88=AB=E5=92=8C=E9=93=B6=E8=A1=8C?= =?UTF-8?q?=E5=8D=A1=E8=AF=86=E5=88=AB=E7=AD=89=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/WxMpServiceAutoConfiguration.java | 3 +- .../weixin/common/api/WxOcrService.java | 40 +- .../common/bean/ocr/WxOcrBankCardResult.java | 29 ++ .../bean/ocr/WxOcrBizLicenseResult.java | 19 +- .../common/bean/ocr/WxOcrCommResult.java | 20 +- .../bean/ocr/WxOcrDrivingLicenseResult.java | 12 +- .../common/bean/ocr/WxOcrDrivingResult.java | 21 +- .../common/bean/ocr/WxOcrIdCardResult.java | 11 +- .../weixin/common/bean/ocr/WxOcrImgSize.java | 8 +- .../weixin/common/bean/ocr/WxOcrPos.java | 12 +- .../OcrDiscernApacheHttpRequestExecutor.java | 0 .../ocr/OcrDiscernRequestExecutor.java | 4 +- weixin-java-miniapp/pom.xml | 6 + .../wx/miniapp/api/WxMaService.java | 7 + .../miniapp/api/impl/BaseWxMaServiceImpl.java | 7 + .../miniapp/api/impl/WxMaOcrServiceImpl.java | 151 +++++++ .../api/impl/WxMaOcrServiceImplTest.java | 385 ++++++++++++++++++ .../wx/miniapp/test/TestConstants.java | 17 + .../me/chanjar/weixin/mp/api/WxMpService.java | 5 +- .../mp/api/impl/BaseWxMpServiceImpl.java | 7 +- .../mp/api/impl/WxMpOcrServiceImpl.java | 64 +-- .../mp/bean/ocr/WxMpOcrBankCardResult.java | 28 -- .../chanjar/weixin/mp/enums/WxMpApiUrl.java | 24 +- .../mp/api/impl/WxMpOcrServiceImplTest.java | 50 +-- .../impl/ProfitSharingServiceImpl.java | 2 + 25 files changed, 756 insertions(+), 176 deletions(-) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxOcrService.java (67%) create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBankCardResult.java rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBizLicenseResult.java (79%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrCommResult.java (58%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrDrivingLicenseResult.java (76%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrDrivingResult.java (83%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrIdCardResult.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrIdCardResult.java (59%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrImgSize.java (62%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrPos.java (70%) rename {weixin-java-mp => weixin-java-common}/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java (100%) rename {weixin-java-mp => weixin-java-common}/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java (95%) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImplTest.java create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/test/TestConstants.java delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java index f46ebf8dc1..491d0da584 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java @@ -1,6 +1,7 @@ package com.binarywang.spring.starter.wxjava.mp.config; import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties; +import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.mp.api.*; import me.chanjar.weixin.mp.api.impl.WxMpServiceHttpClientImpl; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; @@ -176,7 +177,7 @@ public WxMpCommentService wxMpCommentService(WxMpService wxMpService) { @Bean @Deprecated - public WxMpOcrService wxMpOcrService(WxMpService wxMpService) { + public WxOcrService wxMpOcrService(WxMpService wxMpService) { return wxMpService.getOcrService(); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxOcrService.java similarity index 67% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxOcrService.java index f7986d24c1..480ed3e95b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxOcrService.java @@ -1,12 +1,12 @@ -package me.chanjar.weixin.mp.api; +package me.chanjar.weixin.common.api; import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrBankCardResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrBizLicenseResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrCommResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingLicenseResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrIdCardResult; import java.io.File; @@ -17,7 +17,7 @@ * @author Binary Wang * @date 2019-06-22 */ -public interface WxMpOcrService { +public interface WxOcrService { /** * 身份证OCR识别接口. @@ -26,7 +26,7 @@ public interface WxMpOcrService { * @return WxMpOcrIdCardResult * @throws WxErrorException . */ - WxMpOcrIdCardResult idCard(String imgUrl) throws WxErrorException; + WxOcrIdCardResult idCard(String imgUrl) throws WxErrorException; /** * 身份证OCR识别接口. @@ -35,7 +35,7 @@ public interface WxMpOcrService { * @return WxMpOcrIdCardResult * @throws WxErrorException . */ - WxMpOcrIdCardResult idCard(File imgFile) throws WxErrorException; + WxOcrIdCardResult idCard(File imgFile) throws WxErrorException; /** * 银行卡OCR识别接口 @@ -44,7 +44,7 @@ public interface WxMpOcrService { * @return WxMpOcrBankCardResult * @throws WxErrorException . */ - WxMpOcrBankCardResult bankCard(String imgUrl) throws WxErrorException; + WxOcrBankCardResult bankCard(String imgUrl) throws WxErrorException; /** * 银行卡OCR识别接口 @@ -53,7 +53,7 @@ public interface WxMpOcrService { * @return WxMpOcrBankCardResult * @throws WxErrorException . */ - WxMpOcrBankCardResult bankCard(File imgFile) throws WxErrorException; + WxOcrBankCardResult bankCard(File imgFile) throws WxErrorException; /** * 行驶证OCR识别接口 @@ -62,7 +62,7 @@ public interface WxMpOcrService { * @return WxMpOcrDrivingResult * @throws WxErrorException . */ - WxMpOcrDrivingResult driving(String imgUrl) throws WxErrorException; + WxOcrDrivingResult driving(String imgUrl) throws WxErrorException; /** * 行驶证OCR识别接口 @@ -71,7 +71,7 @@ public interface WxMpOcrService { * @return WxMpOcrDrivingResult * @throws WxErrorException . */ - WxMpOcrDrivingResult driving(File imgFile) throws WxErrorException; + WxOcrDrivingResult driving(File imgFile) throws WxErrorException; /** * 驾驶证OCR识别接口 @@ -80,7 +80,7 @@ public interface WxMpOcrService { * @return WxMpOcrDrivingLicenseResult * @throws WxErrorException . */ - WxMpOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException; + WxOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException; /** * 驾驶证OCR识别接口 @@ -89,7 +89,7 @@ public interface WxMpOcrService { * @return WxMpOcrDrivingLicenseResult * @throws WxErrorException . */ - WxMpOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException; + WxOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException; /** * 营业执照OCR识别接口 @@ -98,7 +98,7 @@ public interface WxMpOcrService { * @return WxMpOcrBizLicenseResult * @throws WxErrorException . */ - WxMpOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException; + WxOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException; /** * 营业执照OCR识别接口 @@ -107,7 +107,7 @@ public interface WxMpOcrService { * @return WxMpOcrBizLicenseResult * @throws WxErrorException . */ - WxMpOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException; + WxOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException; /** * 通用印刷体OCR识别接口 @@ -117,7 +117,7 @@ public interface WxMpOcrService { * @return WxMpOcrCommResult * @throws WxErrorException . */ - WxMpOcrCommResult comm(String imgUrl) throws WxErrorException; + WxOcrCommResult comm(String imgUrl) throws WxErrorException; /** * 通用印刷体OCR识别接口 @@ -127,5 +127,5 @@ public interface WxMpOcrService { * @return WxMpOcrCommResult * @throws WxErrorException . */ - WxMpOcrCommResult comm(File imgFile) throws WxErrorException; + WxOcrCommResult comm(File imgFile) throws WxErrorException; } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBankCardResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBankCardResult.java new file mode 100644 index 0000000000..d5ff0b901d --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBankCardResult.java @@ -0,0 +1,29 @@ +package me.chanjar.weixin.common.bean.ocr; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.io.Serializable; + +/** + * 银行卡OCR识别结果 + * + * @author Theo Nie + */ +@Data +public class WxOcrBankCardResult implements Serializable { + + private static final long serialVersionUID = 554136620394204143L; + @SerializedName("number") + private String number; + + @Override + public String toString() { + return WxGsonBuilder.create().toJson(this); + } + + public static WxOcrBankCardResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOcrBankCardResult.class); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBizLicenseResult.java similarity index 79% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBizLicenseResult.java index aa97fc83f2..2e83443e95 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBizLicenseResult.java @@ -1,8 +1,8 @@ -package me.chanjar.weixin.mp.bean.ocr; +package me.chanjar.weixin.common.bean.ocr; import com.google.gson.annotations.SerializedName; import lombok.Data; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import java.io.Serializable; @@ -10,7 +10,7 @@ * @author Theo Nie */ @Data -public class WxMpOcrBizLicenseResult implements Serializable { +public class WxOcrBizLicenseResult implements Serializable { private static final long serialVersionUID = -5007671093920178291L; /** @@ -82,26 +82,27 @@ public class WxMpOcrBizLicenseResult implements Serializable { * 图片大小 */ @SerializedName("img_size") - private WxMpOcrImgSize imgSize; + private WxOcrImgSize imgSize; - public static WxMpOcrBizLicenseResult fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpOcrBizLicenseResult.class); + public static WxOcrBizLicenseResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOcrBizLicenseResult.class); } @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } @Data public static class CertPosition implements Serializable { private static final long serialVersionUID = 290286813344131863L; + @SerializedName("pos") - private WxMpOcrPos pos; + private WxOcrPos pos; @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrCommResult.java similarity index 58% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrCommResult.java index cc391bdfee..5f56d16e3c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrCommResult.java @@ -1,8 +1,8 @@ -package me.chanjar.weixin.mp.bean.ocr; +package me.chanjar.weixin.common.bean.ocr; import com.google.gson.annotations.SerializedName; import lombok.Data; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import java.io.Serializable; import java.util.List; @@ -11,35 +11,35 @@ * @author Theo Nie */ @Data -public class WxMpOcrCommResult implements Serializable { +public class WxOcrCommResult implements Serializable { private static final long serialVersionUID = 455833771627756440L; @SerializedName("img_size") - private WxMpOcrImgSize imgSize; + private WxOcrImgSize imgSize; @SerializedName("items") private List items; - public static WxMpOcrCommResult fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpOcrCommResult.class); + public static WxOcrCommResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOcrCommResult.class); } @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } @Data public static class Items implements Serializable { - private static final long serialVersionUID = 3066181677009102791L; + @SerializedName("text") private String text; @SerializedName("pos") - private WxMpOcrPos pos; + private WxOcrPos pos; @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrDrivingLicenseResult.java similarity index 76% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrDrivingLicenseResult.java index 3ef8fee91c..c9306200de 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrDrivingLicenseResult.java @@ -1,8 +1,8 @@ -package me.chanjar.weixin.mp.bean.ocr; +package me.chanjar.weixin.common.bean.ocr; import com.google.gson.annotations.SerializedName; import lombok.Data; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import java.io.Serializable; @@ -10,7 +10,7 @@ * @author Theo Nie */ @Data -public class WxMpOcrDrivingLicenseResult implements Serializable { +public class WxOcrDrivingLicenseResult implements Serializable { private static final long serialVersionUID = -6984670645802585738L; /** @@ -71,10 +71,10 @@ public class WxMpOcrDrivingLicenseResult implements Serializable { @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } - public static WxMpOcrDrivingLicenseResult fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpOcrDrivingLicenseResult.class); + public static WxOcrDrivingLicenseResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOcrDrivingLicenseResult.class); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrDrivingResult.java similarity index 83% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrDrivingResult.java index 3e5576934e..b486baf1c4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrDrivingResult.java @@ -1,8 +1,8 @@ -package me.chanjar.weixin.mp.bean.ocr; +package me.chanjar.weixin.common.bean.ocr; import com.google.gson.annotations.SerializedName; import lombok.Data; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import java.io.Serializable; @@ -10,9 +10,9 @@ * @author Theo Nie */ @Data -public class WxMpOcrDrivingResult implements Serializable { - +public class WxOcrDrivingResult implements Serializable { private static final long serialVersionUID = -7477484374200211303L; + /** * 车牌号码 */ @@ -107,26 +107,27 @@ public class WxMpOcrDrivingResult implements Serializable { * 图片大小 */ @SerializedName("img_size") - private WxMpOcrImgSize imgSize; + private WxOcrImgSize imgSize; @Data public static class CardPosition implements Serializable { private static final long serialVersionUID = 2884515165228160517L; + @SerializedName("pos") - private WxMpOcrPos pos; + private WxOcrPos pos; @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } } - public static WxMpOcrDrivingResult fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpOcrDrivingResult.class); + public static WxOcrDrivingResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOcrDrivingResult.class); } @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrIdCardResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrIdCardResult.java similarity index 59% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrIdCardResult.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrIdCardResult.java index fb1749682b..0b1e0ff838 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrIdCardResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrIdCardResult.java @@ -1,9 +1,8 @@ -package me.chanjar.weixin.mp.bean.ocr; +package me.chanjar.weixin.common.bean.ocr; import com.google.gson.annotations.SerializedName; import lombok.Data; -import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import java.io.Serializable; @@ -14,7 +13,7 @@ * @date 2019-06-23 */ @Data -public class WxMpOcrIdCardResult implements Serializable { +public class WxOcrIdCardResult implements Serializable { private static final long serialVersionUID = 8184352486986729980L; @SerializedName("type") @@ -26,8 +25,8 @@ public class WxMpOcrIdCardResult implements Serializable { @SerializedName("valid_date") private String validDate; - public static WxMpOcrIdCardResult fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpOcrIdCardResult.class); + public static WxOcrIdCardResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOcrIdCardResult.class); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrImgSize.java similarity index 62% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrImgSize.java index f30a15399c..f5446ab405 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrImgSize.java @@ -1,8 +1,8 @@ -package me.chanjar.weixin.mp.bean.ocr; +package me.chanjar.weixin.common.bean.ocr; import com.google.gson.annotations.SerializedName; import lombok.Data; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import java.io.Serializable; @@ -10,7 +10,7 @@ * @author Theo Nie */ @Data -public class WxMpOcrImgSize implements Serializable { +public class WxOcrImgSize implements Serializable { private static final long serialVersionUID = 5234409123551074168L; @SerializedName("w") @@ -20,6 +20,6 @@ public class WxMpOcrImgSize implements Serializable { @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrPos.java similarity index 70% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrPos.java index 0a4fe586e4..54089f3235 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrPos.java @@ -1,8 +1,8 @@ -package me.chanjar.weixin.mp.bean.ocr; +package me.chanjar.weixin.common.bean.ocr; import com.google.gson.annotations.SerializedName; import lombok.Data; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import java.io.Serializable; @@ -10,7 +10,7 @@ * @author Theo Nie */ @Data -public class WxMpOcrPos implements Serializable { +public class WxOcrPos implements Serializable { private static final long serialVersionUID = 4204160206873907920L; @SerializedName("left_top") @@ -24,11 +24,11 @@ public class WxMpOcrPos implements Serializable { @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } @Data - public static class Coordinate implements Serializable{ + public static class Coordinate implements Serializable { private static final long serialVersionUID = 8675059935386304399L; @SerializedName("x") private int x; @@ -37,7 +37,7 @@ public static class Coordinate implements Serializable{ @Override public String toString() { - return WxMpGsonBuilder.create().toJson(this); + return WxGsonBuilder.create().toJson(this); } } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java similarity index 100% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java similarity index 95% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java index 536097e497..dff256e472 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java @@ -12,8 +12,8 @@ /** * . * - * @author zhayueran - * @date 2019/6/27 15:06 + * @author zhayueran + * @date 2019/6/27 15:06 */ public abstract class OcrDiscernRequestExecutor implements RequestExecutor { protected RequestHttp requestHttp; diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index e6c4858bd2..6f18b6158d 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -90,6 +90,12 @@ 1.0.0 true + + org.mockito + mockito-core + 3.3.3 + test + 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 f419bfea17..c7de9cc472 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 @@ -2,6 +2,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.config.WxMaConfig; +import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.service.WxService; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; @@ -288,4 +289,10 @@ public interface WxMaService extends WxService { */ WxMaLiveGoodsService getLiveGoodsService(); + /** + * 获取ocr实现接口服务对象 + * + * @return 。 + */ + WxOcrService getOcrService(); } 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 5a2fa22b44..ac48ceda8e 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java @@ -10,6 +10,7 @@ import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.WxType; +import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; @@ -57,6 +58,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH private final WxMaCloudService cloudService = new WxMaCloudServiceImpl(this); private final WxMaLiveService liveService = new WxMaLiveServiceImpl(this); private final WxMaLiveGoodsService liveGoodsService = new WxMaLiveGoodsServiceImpl(this); + private final WxOcrService ocrService = new WxMaOcrServiceImpl(this); private int retrySleepMillis = 1000; private int maxRetryTimes = 5; @@ -401,4 +403,9 @@ public WxMaLiveGoodsService getLiveGoodsService() { return this.liveGoodsService; } + @Override + public WxOcrService getOcrService() { + return this.ocrService; + } + } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java new file mode 100644 index 0000000000..b7df6849e7 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java @@ -0,0 +1,151 @@ +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.api.WxOcrService; +import me.chanjar.weixin.common.bean.ocr.*; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor; + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * ocr 接口实现. + * + * @author Binary Wang + * @date 2019-06-22 + */ +@RequiredArgsConstructor +public class WxMaOcrServiceImpl implements WxOcrService { + private static final String IDCARD = "https://api.weixin.qq.com/cv/ocr/idcard?img_url=%s"; + private static final String FILEIDCARD = "https://api.weixin.qq.com/cv/ocr/idcard"; + private static final String BANK_CARD = "https://api.weixin.qq.com/cv/ocr/bankcard?img_url=%s"; + private static final String FILE_BANK_CARD = "https://api.weixin.qq.com/cv/ocr/bankcard"; + private static final String DRIVING = "https://api.weixin.qq.com/cv/ocr/driving?img_url=%s"; + private static final String FILE_DRIVING = "https://api.weixin.qq.com/cv/ocr/driving"; + private static final String DRIVING_LICENSE = "https://api.weixin.qq.com/cv/ocr/drivinglicense?img_url=%s"; + private static final String FILE_DRIVING_LICENSE = "https://api.weixin.qq.com/cv/ocr/drivinglicense"; + private static final String BIZ_LICENSE = "https://api.weixin.qq.com/cv/ocr/bizlicense?img_url=%s"; + private static final String FILE_BIZ_LICENSE = "https://api.weixin.qq.com/cv/ocr/bizlicense"; + private static final String COMM = "https://api.weixin.qq.com/cv/ocr/comm?img_url=%s"; + private static final String FILE_COMM = "https://api.weixin.qq.com/cv/ocr/comm"; + + private final WxMaService mainService; + + @Override + public WxOcrIdCardResult idCard(String imgUrl) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // ignore cannot happen + } + + final String result = this.mainService.get(String.format(IDCARD, imgUrl), null); + return WxOcrIdCardResult.fromJson(result); + } + + @Override + public WxOcrIdCardResult idCard(File imgFile) throws WxErrorException { + String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), + FILEIDCARD, imgFile); + return WxOcrIdCardResult.fromJson(result); + } + + @Override + public WxOcrBankCardResult bankCard(String imgUrl) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // ignore cannot happen + } + + final String result = this.mainService.get(String.format(BANK_CARD, imgUrl), null); + return WxOcrBankCardResult.fromJson(result); + } + + @Override + public WxOcrBankCardResult bankCard(File imgFile) throws WxErrorException { + String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), + FILE_BANK_CARD, imgFile); + return WxOcrBankCardResult.fromJson(result); + } + + @Override + public WxOcrDrivingResult driving(String imgUrl) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // ignore cannot happen + } + + final String result = this.mainService.get(String.format(DRIVING, imgUrl), null); + return WxOcrDrivingResult.fromJson(result); + } + + @Override + public WxOcrDrivingResult driving(File imgFile) throws WxErrorException { + String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), + FILE_DRIVING, imgFile); + return WxOcrDrivingResult.fromJson(result); + } + + @Override + public WxOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // ignore cannot happen + } + + final String result = this.mainService.get(String.format(DRIVING_LICENSE, imgUrl), null); + return WxOcrDrivingLicenseResult.fromJson(result); + } + + @Override + public WxOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException { + String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), + FILE_DRIVING_LICENSE, imgFile); + return WxOcrDrivingLicenseResult.fromJson(result); + } + + @Override + public WxOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // ignore cannot happen + } + + final String result = this.mainService.get(String.format(BIZ_LICENSE, imgUrl), null); + return WxOcrBizLicenseResult.fromJson(result); + } + + @Override + public WxOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException { + String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), + FILE_BIZ_LICENSE, imgFile); + return WxOcrBizLicenseResult.fromJson(result); + } + + @Override + public WxOcrCommResult comm(String imgUrl) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // ignore cannot happen + } + + final String result = this.mainService.get(String.format(COMM, imgUrl), null); + return WxOcrCommResult.fromJson(result); + } + + @Override + public WxOcrCommResult comm(File imgFile) throws WxErrorException { + String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), + FILE_COMM, imgFile); + return WxOcrCommResult.fromJson(result); + } +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImplTest.java new file mode 100644 index 0000000000..b52476fb92 --- /dev/null +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImplTest.java @@ -0,0 +1,385 @@ +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.test.ApiTestModule; +import cn.binarywang.wx.miniapp.test.TestConstants; +import me.chanjar.weixin.common.bean.ocr.*; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.fs.FileUtils; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import javax.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Binary Wang + * @date 2020-07-05 + */ +@Test +@Guice(modules = ApiTestModule.class) +public class WxMaOcrServiceImplTest { + @Inject + private WxMaService service; + + @Test + public void testIdCard() throws WxErrorException { + final WxOcrIdCardResult result = this.service.getOcrService().idCard( + "https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testIdCard2() throws Exception { + InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxOcrIdCardResult result = this.service.getOcrService().idCard(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testBankCard() throws WxErrorException { + final WxOcrBankCardResult result = this.service.getOcrService().bankCard("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testBankCard2() throws Exception { + InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxOcrBankCardResult result = this.service.getOcrService().bankCard(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testDriving() throws WxErrorException { + final WxOcrDrivingResult result = this.service.getOcrService().driving("https://res.wx.qq.com/op_res/T051P5uWvh9gSJ9j78tWib53WiNi2pHSSZhoO8wnY3Av-djpsA4kA9whbtt6_Tb6"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testDriving2() throws Exception { + InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxOcrDrivingResult result = this.service.getOcrService().driving(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testDrivingLicense() throws WxErrorException { + final WxOcrDrivingLicenseResult result = this.service.getOcrService().drivingLicense("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testDrivingLicense2() throws Exception { + InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxOcrDrivingLicenseResult result = this.service.getOcrService().drivingLicense(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testBizLicense() throws WxErrorException { + final WxOcrBizLicenseResult result = this.service.getOcrService().bizLicense("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testBizLicense2() throws Exception { + InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxOcrBizLicenseResult result = this.service.getOcrService().bizLicense(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testComm() throws WxErrorException { + final WxOcrCommResult result = this.service.getOcrService().comm("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testComm2() throws Exception { + InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxOcrCommResult result = this.service.getOcrService().comm(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + private InputStream getImageStream(String url) { + try { + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setReadTimeout(5000); + connection.setConnectTimeout(5000); + connection.setRequestMethod("GET"); + if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) { + return connection.getInputStream(); + } + } catch (IOException e) { + System.out.println("获取网络图片出现异常,图片路径为:" + url); + } + return null; + } + + public static class MockTest { + private final WxMaService wxService = mock(WxMaService.class); + + @Test + public void testIdCard() throws Exception { + String returnJson = "{\"type\":\"Back\",\"name\":\"张三\",\"id\":\"110101199909090099\",\"valid_date\":\"20110101-20210201\"}"; + + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMaOcrServiceImpl wxMpOcrService = new WxMaOcrServiceImpl(wxService); + + final WxOcrIdCardResult result = wxMpOcrService.idCard("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testBankCard() throws Exception { + String returnJson = "{\"number\":\"24234234345234\"}"; + + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMaOcrServiceImpl ocrService = new WxMaOcrServiceImpl(wxService); + final WxOcrBankCardResult result = ocrService.bankCard("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testDriving() throws Exception { + String returnJson = "{\n" + + " \"errcode\": 0,\n" + + " \"errmsg\": \"ok\",\n" + + " \"plate_num\": \"粤xxxxx\", //车牌号码\n" + + " \"vehicle_type\": \"小型普通客车\", //车辆类型\n" + + " \"owner\": \"东莞市xxxxx机械厂\", //所有人\n" + + " \"addr\": \"广东省东莞市xxxxx号\", //住址\n" + + " \"use_character\": \"非营运\", //使用性质\n" + + " \"model\": \"江淮牌HFCxxxxxxx\", //品牌型号\n" + + " \"vin\": \"LJ166xxxxxxxx51\", //车辆识别代号\n" + + " \"engine_num\": \"J3xxxxx3\", //发动机号码\n" + + " \"register_date\": \"2018-07-06\", //注册日期\n" + + " \"issue_date\": \"2018-07-01\", //发证日期\n" + + " \"plate_num_b\": \"粤xxxxx\", //车牌号码\n" + + " \"record\": \"441xxxxxx3\", //号牌\n" + + " \"passengers_num\": \"7人\", //核定载人数\n" + + " \"total_quality\": \"2700kg\", //总质量\n" + + " \"prepare_quality\": \"1995kg\", //整备质量\n" + + " \"overall_size\": \"4582x1795x1458mm\", //外廓尺寸\n" + + " \"card_position_front\": {//卡片正面位置(检测到卡片正面才会返回)\n" + + " \"pos\": {\n" + + " \"left_top\": {\n" + + " \"x\": 119, \n" + + " \"y\": 2925\n" + + " }, \n" + + " \"right_top\": {\n" + + " \"x\": 1435, \n" + + " \"y\": 2887\n" + + " }, \n" + + " \"right_bottom\": {\n" + + " \"x\": 1435, \n" + + " \"y\": 3793\n" + + " }, \n" + + " \"left_bottom\": {\n" + + " \"x\": 119, \n" + + " \"y\": 3831\n" + + " }\n" + + " }\n" + + " }, \n" + + " \"card_position_back\": {//卡片反面位置(检测到卡片反面才会返回)\n" + + " \"pos\": {\n" + + " \"left_top\": {\n" + + " \"x\": 1523, \n" + + " \"y\": 2849\n" + + " }, \n" + + " \"right_top\": {\n" + + " \"x\": 2898, \n" + + " \"y\": 2887\n" + + " }, \n" + + " \"right_bottom\": {\n" + + " \"x\": 2927, \n" + + " \"y\": 3831\n" + + " }, \n" + + " \"left_bottom\": {\n" + + " \"x\": 1523, \n" + + " \"y\": 3831\n" + + " }\n" + + " }\n" + + " }, \n" + + " \"img_size\": {//图片大小\n" + + " \"w\": 3120, \n" + + " \"h\": 4208\n" + + " }\n" + + "}"; + + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMaOcrServiceImpl ocrService = new WxMaOcrServiceImpl(wxService); + + final WxOcrDrivingResult result = ocrService.driving("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testDrivingLicense() throws Exception { + String returnJson = "{\n" + + " \"errcode\": 0,\n" + + " \"errmsg\": \"ok\",\n" + + " \"id_num\": \"660601xxxxxxxx1234\", //证号\n" + + " \"name\": \"张三\", //姓名\n" + + " \"sex\": \"男\", //性别\n" + + " \"nationality\": \"中国\", //国籍\n" + + " \"address\": \"广东省东莞市xxxxx号\", //住址\n" + + " \"birth_date\": \"1990-12-21\", //出生日期\n" + + " \"issue_date\": \"2012-12-21\", //初次领证日期\n" + + " \"car_class\": \"C1\", //准驾车型\n" + + " \"valid_from\": \"2018-07-06\", //有效期限起始日\n" + + " \"valid_to\": \"2020-07-01\", //有效期限终止日\n" + + " \"official_seal\": \"xx市公安局公安交通管理局\" //印章文字\n" + + "}"; + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMaOcrServiceImpl wxMpOcrService = new WxMaOcrServiceImpl(wxService); + + final WxOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testBizLicense() throws Exception { + String returnJson = "{\n" + + " \"errcode\": 0, \n" + + " \"errmsg\": \"ok\", \n" + + " \"reg_num\": \"123123\",//注册号\n" + + " \"serial\": \"123123\",//编号\n" + + " \"legal_representative\": \"张三\", //法定代表人姓名\n" + + " \"enterprise_name\": \"XX饮食店\", //企业名称\n" + + " \"type_of_organization\": \"个人经营\", //组成形式\n" + + " \"address\": \"XX市XX区XX路XX号\", //经营场所/企业住所\n" + + " \"type_of_enterprise\": \"xxx\", //公司类型\n" + + " \"business_scope\": \"中型餐馆(不含凉菜、不含裱花蛋糕,不含生食海产品)。\", //经营范围\n" + + " \"registered_capital\": \"200万\", //注册资本\n" + + " \"paid_in_capital\": \"200万\", //实收资本\n" + + " \"valid_period\": \"2019年1月1日\", //营业期限\n" + + " \"registered_date\": \"2018年1月1日\", //注册日期/成立日期\n" + + " \"cert_position\": { //营业执照位置\n" + + " \"pos\": {\n" + + " \"left_top\": {\n" + + " \"x\": 155, \n" + + " \"y\": 191\n" + + " }, \n" + + " \"right_top\": {\n" + + " \"x\": 725, \n" + + " \"y\": 157\n" + + " }, \n" + + " \"right_bottom\": {\n" + + " \"x\": 743, \n" + + " \"y\": 512\n" + + " }, \n" + + " \"left_bottom\": {\n" + + " \"x\": 164, \n" + + " \"y\": 525\n" + + " }\n" + + " }\n" + + " }, \n" + + " \"img_size\": { //图片大小\n" + + " \"w\": 966, \n" + + " \"h\": 728\n" + + " }\n" + + "}"; + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMaOcrServiceImpl ocrService = new WxMaOcrServiceImpl(wxService); + + final WxOcrBizLicenseResult result = ocrService.bizLicense("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testComm() throws Exception { + String returnJson = "{\n" + + " \"errcode\": 0, \n" + + " \"errmsg\": \"ok\", \n" + + " \"items\": [ //识别结果\n" + + " {\n" + + " \"text\": \"腾讯\", \n" + + " \"pos\": {\n" + + " \"left_top\": {\n" + + " \"x\": 575, \n" + + " \"y\": 519\n" + + " }, \n" + + " \"right_top\": {\n" + + " \"x\": 744, \n" + + " \"y\": 519\n" + + " }, \n" + + " \"right_bottom\": {\n" + + " \"x\": 744, \n" + + " \"y\": 532\n" + + " }, \n" + + " \"left_bottom\": {\n" + + " \"x\": 573, \n" + + " \"y\": 532\n" + + " }\n" + + " }\n" + + " }, \n" + + " {\n" + + " \"text\": \"微信团队\", \n" + + " \"pos\": {\n" + + " \"left_top\": {\n" + + " \"x\": 670, \n" + + " \"y\": 516\n" + + " }, \n" + + " \"right_top\": {\n" + + " \"x\": 762, \n" + + " \"y\": 517\n" + + " }, \n" + + " \"right_bottom\": {\n" + + " \"x\": 762, \n" + + " \"y\": 532\n" + + " }, \n" + + " \"left_bottom\": {\n" + + " \"x\": 670, \n" + + " \"y\": 531\n" + + " }\n" + + " }\n" + + " }\n" + + " ], \n" + + " \"img_size\": { //图片大小\n" + + " \"w\": 1280, \n" + + " \"h\": 720\n" + + " }\n" + + "}"; + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMaOcrServiceImpl ocrService = new WxMaOcrServiceImpl(wxService); + + final WxOcrCommResult result = ocrService.comm("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + } +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/test/TestConstants.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/test/TestConstants.java new file mode 100644 index 0000000000..091de1d3ed --- /dev/null +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/test/TestConstants.java @@ -0,0 +1,17 @@ +package cn.binarywang.wx.miniapp.test; + +/** + *
+ * 仅供测试使用的一些常量
+ * Created by Binary Wang on 2017-3-9.
+ * 
+ */ +public class TestConstants { + /////////////////////// + // 文件类型 + /////////////////////// + public static final String FILE_JPG = "jpeg"; + public static final String FILE_MP3 = "mp3"; + public static final String FILE_AMR = "amr"; + public static final String FILE_MP4 = "mp4"; +} 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 3803ef9793..a1841bff1d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.mp.api; +import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.WxNetCheckResult; import me.chanjar.weixin.common.error.WxErrorException; @@ -555,7 +556,7 @@ public interface WxMpService extends WxService { * * @return WxMpWifiService */ - WxMpOcrService getOcrService(); + WxOcrService getOcrService(); /** * 返回图像处理接口的实现类对象,以方便调用其各个接口. @@ -688,7 +689,7 @@ public interface WxMpService extends WxService { * * @param ocrService . */ - void setOcrService(WxMpOcrService ocrService); + void setOcrService(WxOcrService ocrService); /** * . 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 043ddd2be9..0f2cb403ec 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 @@ -10,6 +10,7 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.WxType; +import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.WxNetCheckResult; @@ -70,7 +71,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH private final WxMpWifiService wifiService = new WxMpWifiServiceImpl(this); private WxMpMarketingService marketingService = new WxMpMarketingServiceImpl(this); private WxMpCommentService commentService = new WxMpCommentServiceImpl(this); - private WxMpOcrService ocrService = new WxMpOcrServiceImpl(this); + private WxOcrService ocrService = new WxMpOcrServiceImpl(this); private WxMpImgProcService imgProcService = new WxMpImgProcServiceImpl(this); @Getter @@ -663,7 +664,7 @@ public WxMpWifiService getWifiService() { } @Override - public WxMpOcrService getOcrService() { + public WxOcrService getOcrService() { return this.ocrService; } @@ -678,7 +679,7 @@ public void setMarketingService(WxMpMarketingService marketingService) { } @Override - public void setOcrService(WxMpOcrService ocrService) { + public void setOcrService(WxOcrService ocrService) { this.ocrService = ocrService; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java index dbf3dd0395..6b40c98226 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java @@ -2,14 +2,14 @@ import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpOcrService; +import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrBankCardResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrBizLicenseResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrCommResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingLicenseResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrIdCardResult; import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor; import java.io.File; @@ -37,11 +37,11 @@ * @date 2019-06-22 */ @RequiredArgsConstructor -public class WxMpOcrServiceImpl implements WxMpOcrService { +public class WxMpOcrServiceImpl implements WxOcrService { private final WxMpService mainService; @Override - public WxMpOcrIdCardResult idCard(String imgUrl) throws WxErrorException { + public WxOcrIdCardResult idCard(String imgUrl) throws WxErrorException { try { imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { @@ -50,18 +50,18 @@ public WxMpOcrIdCardResult idCard(String imgUrl) throws WxErrorException { final String result = this.mainService.get(String.format(IDCARD.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); - return WxMpOcrIdCardResult.fromJson(result); + return WxOcrIdCardResult.fromJson(result); } @Override - public WxMpOcrIdCardResult idCard(File imgFile) throws WxErrorException { + public WxOcrIdCardResult idCard(File imgFile) throws WxErrorException { String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), FILEIDCARD.getUrl(this.mainService.getWxMpConfigStorage()), imgFile); - return WxMpOcrIdCardResult.fromJson(result); + return WxOcrIdCardResult.fromJson(result); } @Override - public WxMpOcrBankCardResult bankCard(String imgUrl) throws WxErrorException { + public WxOcrBankCardResult bankCard(String imgUrl) throws WxErrorException { try { imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { @@ -70,18 +70,18 @@ public WxMpOcrBankCardResult bankCard(String imgUrl) throws WxErrorException { final String result = this.mainService.get(String.format(BANK_CARD.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); - return WxMpOcrBankCardResult.fromJson(result); + return WxOcrBankCardResult.fromJson(result); } @Override - public WxMpOcrBankCardResult bankCard(File imgFile) throws WxErrorException { + public WxOcrBankCardResult bankCard(File imgFile) throws WxErrorException { String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), FILE_BANK_CARD.getUrl(this.mainService.getWxMpConfigStorage()), imgFile); - return WxMpOcrBankCardResult.fromJson(result); + return WxOcrBankCardResult.fromJson(result); } @Override - public WxMpOcrDrivingResult driving(String imgUrl) throws WxErrorException { + public WxOcrDrivingResult driving(String imgUrl) throws WxErrorException { try { imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { @@ -90,18 +90,18 @@ public WxMpOcrDrivingResult driving(String imgUrl) throws WxErrorException { final String result = this.mainService.get(String.format(DRIVING.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); - return WxMpOcrDrivingResult.fromJson(result); + return WxOcrDrivingResult.fromJson(result); } @Override - public WxMpOcrDrivingResult driving(File imgFile) throws WxErrorException { + public WxOcrDrivingResult driving(File imgFile) throws WxErrorException { String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), FILE_DRIVING.getUrl(this.mainService.getWxMpConfigStorage()), imgFile); - return WxMpOcrDrivingResult.fromJson(result); + return WxOcrDrivingResult.fromJson(result); } @Override - public WxMpOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException { + public WxOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException { try { imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { @@ -110,18 +110,18 @@ public WxMpOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorE final String result = this.mainService.get(String.format(DRIVING_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); - return WxMpOcrDrivingLicenseResult.fromJson(result); + return WxOcrDrivingLicenseResult.fromJson(result); } @Override - public WxMpOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException { + public WxOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException { String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), FILE_DRIVING_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), imgFile); - return WxMpOcrDrivingLicenseResult.fromJson(result); + return WxOcrDrivingLicenseResult.fromJson(result); } @Override - public WxMpOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException { + public WxOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException { try { imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { @@ -130,18 +130,18 @@ public WxMpOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException final String result = this.mainService.get(String.format(BIZ_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); - return WxMpOcrBizLicenseResult.fromJson(result); + return WxOcrBizLicenseResult.fromJson(result); } @Override - public WxMpOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException { + public WxOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException { String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), FILE_BIZ_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), imgFile); - return WxMpOcrBizLicenseResult.fromJson(result); + return WxOcrBizLicenseResult.fromJson(result); } @Override - public WxMpOcrCommResult comm(String imgUrl) throws WxErrorException { + public WxOcrCommResult comm(String imgUrl) throws WxErrorException { try { imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { @@ -150,13 +150,13 @@ public WxMpOcrCommResult comm(String imgUrl) throws WxErrorException { final String result = this.mainService.get(String.format(COMM.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); - return WxMpOcrCommResult.fromJson(result); + return WxOcrCommResult.fromJson(result); } @Override - public WxMpOcrCommResult comm(File imgFile) throws WxErrorException { + public WxOcrCommResult comm(File imgFile) throws WxErrorException { String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()), FILE_COMM.getUrl(this.mainService.getWxMpConfigStorage()), imgFile); - return WxMpOcrCommResult.fromJson(result); + return WxOcrCommResult.fromJson(result); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java deleted file mode 100644 index 9b76a31579..0000000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.chanjar.weixin.mp.bean.ocr; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - -import java.io.Serializable; - -/** - * 银行卡OCR识别结果 - * @author Theo Nie - */ -@Data -public class WxMpOcrBankCardResult implements Serializable { - - private static final long serialVersionUID = 554136620394204143L; - @SerializedName("number") - private String number; - - @Override - public String toString() { - return WxMpGsonBuilder.create().toJson(this); - } - - public static WxMpOcrBankCardResult fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpOcrBankCardResult.class); - } -} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java index 9bc0e1de03..7f3b45d249 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 @@ -199,8 +199,8 @@ enum Menu implements WxMpApiUrl { */ MENU_ADDCONDITIONAL(API_DEFAULT_HOST_URL, "/cgi-bin/menu/addconditional"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -224,8 +224,8 @@ enum Qrcode implements WxMpApiUrl { */ SHOW_QRCODE_WITH_TICKET(MP_DEFAULT_HOST_URL, "/cgi-bin/showqrcode?ticket=%s"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -252,8 +252,8 @@ enum ShakeAround implements WxMpApiUrl { */ SHAKEAROUND_RELATION_SEARCH(API_DEFAULT_HOST_URL, "/shakearound/relation/search"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -272,8 +272,8 @@ enum SubscribeMsg implements WxMpApiUrl { */ SEND_MESSAGE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/template/subscribe"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -376,8 +376,8 @@ enum UserTag implements WxMpApiUrl { */ TAGS_GETIDLIST(API_DEFAULT_HOST_URL, "/cgi-bin/tags/getidlist"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -426,8 +426,8 @@ enum AiOpen implements WxMpApiUrl { */ VOICE_QUERY_RESULT_URL(API_DEFAULT_HOST_URL, "/cgi-bin/media/voice/queryrecoresultfortext"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java index 55bfa06233..5f71786681 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java @@ -5,12 +5,12 @@ import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.test.ApiTestModule; import me.chanjar.weixin.mp.api.test.TestConstants; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult; -import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrBankCardResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrBizLicenseResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrCommResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingLicenseResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingResult; +import me.chanjar.weixin.common.bean.ocr.WxOcrIdCardResult; import org.testng.annotations.Guice; import org.testng.annotations.Test; @@ -38,11 +38,11 @@ @Guice(modules = ApiTestModule.class) public class WxMpOcrServiceImplTest { @Inject - private WxMpService mpService; + private WxMpService service; @Test public void testIdCard() throws WxErrorException { - final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard( + final WxOcrIdCardResult result = this.service.getOcrService().idCard( "https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6"); assertThat(result).isNotNull(); System.out.println(result); @@ -52,14 +52,14 @@ public void testIdCard() throws WxErrorException { public void testIdCard2() throws Exception { InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6"); File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); - final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(tempFile); + final WxOcrIdCardResult result = this.service.getOcrService().idCard(tempFile); assertThat(result).isNotNull(); System.out.println(result); } @Test public void testBankCard() throws WxErrorException { - final WxMpOcrBankCardResult result = this.mpService.getOcrService().bankCard("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih"); + final WxOcrBankCardResult result = this.service.getOcrService().bankCard("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih"); assertThat(result).isNotNull(); System.out.println(result); } @@ -68,14 +68,14 @@ public void testBankCard() throws WxErrorException { public void testBankCard2() throws Exception { InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih"); File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); - final WxMpOcrBankCardResult result = this.mpService.getOcrService().bankCard(tempFile); + final WxOcrBankCardResult result = this.service.getOcrService().bankCard(tempFile); assertThat(result).isNotNull(); System.out.println(result); } @Test public void testDriving() throws WxErrorException { - final WxMpOcrDrivingResult result = this.mpService.getOcrService().driving("https://res.wx.qq.com/op_res/T051P5uWvh9gSJ9j78tWib53WiNi2pHSSZhoO8wnY3Av-djpsA4kA9whbtt6_Tb6"); + final WxOcrDrivingResult result = this.service.getOcrService().driving("https://res.wx.qq.com/op_res/T051P5uWvh9gSJ9j78tWib53WiNi2pHSSZhoO8wnY3Av-djpsA4kA9whbtt6_Tb6"); assertThat(result).isNotNull(); System.out.println(result); } @@ -84,14 +84,14 @@ public void testDriving() throws WxErrorException { public void testDriving2() throws Exception { InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); - final WxMpOcrDrivingResult result = this.mpService.getOcrService().driving(tempFile); + final WxOcrDrivingResult result = this.service.getOcrService().driving(tempFile); assertThat(result).isNotNull(); System.out.println(result); } @Test public void testDrivingLicense() throws WxErrorException { - final WxMpOcrDrivingLicenseResult result = this.mpService.getOcrService().drivingLicense("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn"); + final WxOcrDrivingLicenseResult result = this.service.getOcrService().drivingLicense("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn"); assertThat(result).isNotNull(); System.out.println(result); } @@ -100,14 +100,14 @@ public void testDrivingLicense() throws WxErrorException { public void testDrivingLicense2() throws Exception { InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn"); File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); - final WxMpOcrDrivingLicenseResult result = this.mpService.getOcrService().drivingLicense(tempFile); + final WxOcrDrivingLicenseResult result = this.service.getOcrService().drivingLicense(tempFile); assertThat(result).isNotNull(); System.out.println(result); } @Test public void testBizLicense() throws WxErrorException { - final WxMpOcrBizLicenseResult result = this.mpService.getOcrService().bizLicense("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL"); + final WxOcrBizLicenseResult result = this.service.getOcrService().bizLicense("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL"); assertThat(result).isNotNull(); System.out.println(result); } @@ -116,14 +116,14 @@ public void testBizLicense() throws WxErrorException { public void testBizLicense2() throws Exception { InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); - final WxMpOcrBizLicenseResult result = this.mpService.getOcrService().bizLicense(tempFile); + final WxOcrBizLicenseResult result = this.service.getOcrService().bizLicense(tempFile); assertThat(result).isNotNull(); System.out.println(result); } @Test public void testComm() throws WxErrorException { - final WxMpOcrCommResult result = this.mpService.getOcrService().comm("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL"); + final WxOcrCommResult result = this.service.getOcrService().comm("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL"); assertThat(result).isNotNull(); System.out.println(result); } @@ -132,7 +132,7 @@ public void testComm() throws WxErrorException { public void testComm2() throws Exception { InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); - final WxMpOcrCommResult result = this.mpService.getOcrService().comm(tempFile); + final WxOcrCommResult result = this.service.getOcrService().comm(tempFile); assertThat(result).isNotNull(); System.out.println(result); } @@ -162,7 +162,7 @@ public void testIdCard() throws Exception { when(wxService.get(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); - final WxMpOcrIdCardResult result = wxMpOcrService.idCard("abc"); + final WxOcrIdCardResult result = wxMpOcrService.idCard("abc"); assertThat(result).isNotNull(); System.out.println(result); } @@ -174,7 +174,7 @@ public void testBankCard() throws Exception { when(wxService.get(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); - final WxMpOcrBankCardResult result = wxMpOcrService.bankCard("abc"); + final WxOcrBankCardResult result = wxMpOcrService.bankCard("abc"); assertThat(result).isNotNull(); System.out.println(result); } @@ -249,7 +249,7 @@ public void testDriving() throws Exception { when(wxService.get(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); - final WxMpOcrDrivingResult result = wxMpOcrService.driving("abc"); + final WxOcrDrivingResult result = wxMpOcrService.driving("abc"); assertThat(result).isNotNull(); System.out.println(result); } @@ -274,7 +274,7 @@ public void testDrivingLicense() throws Exception { when(wxService.get(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); - final WxMpOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc"); + final WxOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc"); assertThat(result).isNotNull(); System.out.println(result); } @@ -324,7 +324,7 @@ public void testBizLicense() throws Exception { when(wxService.get(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); - final WxMpOcrBizLicenseResult result = wxMpOcrService.bizLicense("abc"); + final WxOcrBizLicenseResult result = wxMpOcrService.bizLicense("abc"); assertThat(result).isNotNull(); System.out.println(result); } @@ -386,7 +386,7 @@ public void testComm() throws Exception { when(wxService.get(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); - final WxMpOcrCommResult result = wxMpOcrService.comm("abc"); + final WxOcrCommResult result = wxMpOcrService.comm("abc"); assertThat(result).isNotNull(); System.out.println(result); } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java index 1055320997..c3a2b7219f 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java @@ -76,6 +76,8 @@ public ProfitSharingReceiverResult removeReceiver(ProfitSharingReceiverRequest r @Override public ProfitSharingQueryResult profitSharingQuery(ProfitSharingQueryRequest request) throws WxPayException { + request.setAppid(null); + request.checkAndSign(this.payService.getConfig()); String url = this.payService.getPayBaseUrl() + "/pay/profitsharingquery"; From 8121a521d3c56b86adaaec309969f2a4337043fc Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 5 Jul 2020 22:05:18 +0800 Subject: [PATCH 40/90] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=203.8.4.B?= =?UTF-8?q?=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 +- 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 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index ecd08ae5d7..5c00db5b0f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.8.3.B + 3.8.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 73b578d5f5..902d1a0e73 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.3.B + 3.8.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 066d73409d..e827a68a75 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.3.B + 3.8.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 93b164ded5..96dd35b9c1 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.3.B + 3.8.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 6cb5dcee10..a39374e777 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.3.B + 3.8.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 f7d46d4f33..60b5e6cf76 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.3.B + 3.8.4.B 4.0.0 diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml index c0570ad9f2..976d1483d0 100644 --- a/weixin-graal/pom.xml +++ b/weixin-graal/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.3.B + 3.8.4.B weixin-graal diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 645d510126..ff95e01c88 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.3.B + 3.8.4.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 16785cd1d0..14f16edee0 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.3.B + 3.8.4.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 6f18b6158d..2497aa3c8e 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.3.B + 3.8.4.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 555309038c..eb160cb2b0 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.3.B + 3.8.4.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 719ea23e52..ed551cb399 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.3.B + 3.8.4.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index b14258ed0a..e199395a10 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.8.3.B + 3.8.4.B 4.0.0 From 0adca9650d872388a913699e95ab3ab2fe214215 Mon Sep 17 00:00:00 2001 From: niefy <34568539+niefy@users.noreply.github.com> Date: Mon, 6 Jul 2020 17:01:37 +0800 Subject: [PATCH 41/90] =?UTF-8?q?:art:=20#1659=20Json=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 解决动态添加第一个公众号时由于configStorageMap为null报空指针异常 * Json解析统一优化 Co-authored-by: niefy --- .../binarywang/wx/graal/GraalProcessor.java | 1 - .../ApacheSimpleGetRequestExecutor.java | 1 - .../ApacheSimplePostRequestExecutor.java | 2 -- .../JoddHttpSimpleGetRequestExecutor.java | 1 - .../OkHttpSimpleGetRequestExecutor.java | 1 - .../weixin/common/util/json/GsonParser.java | 23 +++++++++++++++ ...WxMessageInMemoryDuplicateCheckerTest.java | 1 - .../cp/api/WxCpExternalContactService.java | 1 - .../cp/api/impl/BaseWxCpServiceImpl.java | 11 ++++--- .../cp/api/impl/BaseWxCpTpServiceImpl.java | 4 +-- .../cp/api/impl/WxCpAgentServiceImpl.java | 8 ++--- .../cp/api/impl/WxCpChatServiceImpl.java | 9 +++--- .../api/impl/WxCpDepartmentServiceImpl.java | 13 ++++----- .../cp/api/impl/WxCpMediaServiceImpl.java | 2 -- .../cp/api/impl/WxCpMenuServiceImpl.java | 1 - .../cp/api/impl/WxCpOAuth2ServiceImpl.java | 11 ++----- .../weixin/cp/api/impl/WxCpOaServiceImpl.java | 14 ++++----- .../weixin/cp/api/impl/WxCpServiceImpl.java | 6 ++-- .../cp/api/impl/WxCpTagServiceImpl.java | 13 +++++---- .../cp/api/impl/WxCpTaskCardServiceImpl.java | 1 - .../WxCpTpServiceApacheHttpClientImpl.java | 4 +-- .../cp/api/impl/WxCpUserServiceImpl.java | 27 ++++++++--------- .../weixin/cp/bean/WxCpInviteResult.java | 5 ---- .../weixin/cp/bean/WxCpTpXmlMessage.java | 9 ------ .../weixin/cp/bean/WxCpTpXmlPackage.java | 7 ----- .../cp/bean/WxCpUserExternalUnassignList.java | 1 - .../weixin/cp/bean/oa/WxCpTemplateResult.java | 3 -- .../oa/templatedata/TemplateControls.java | 1 - .../control/TemplateAttendance.java | 1 - .../cp/api/impl/BaseWxCpServiceImplTest.java | 1 - .../api/impl/BaseWxCpTpServiceImplTest.java | 4 --- .../cp/api/impl/WxCpAgentServiceImplTest.java | 2 -- .../cp/api/impl/WxCpUserServiceImplTest.java | 1 - .../weixin/cp/bean/WxCpTpXmlPackageTest.java | 1 - .../weixin/cp/demo/WxCpOAuth2Servlet.java | 1 - .../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ++-- .../api/impl/WxMaAnalysisServiceImpl.java | 6 ++-- .../api/impl/WxMaCloudServiceImpl.java | 29 +++++++++---------- .../miniapp/api/impl/WxMaCodeServiceImpl.java | 10 +++---- .../api/impl/WxMaJsapiServiceImpl.java | 11 +++---- .../api/impl/WxMaLiveGoodsServiceImpl.java | 16 +++++----- .../miniapp/api/impl/WxMaLiveServiceImpl.java | 11 ++++--- .../miniapp/api/impl/WxMaMsgServiceImpl.java | 12 ++++---- .../api/impl/WxMaSubscribeServiceImpl.java | 10 +++---- .../wx/miniapp/bean/WxMaRunStepInfo.java | 6 ++-- .../WxCloudDatabaseCreateIndexRequest.java | 1 - .../bean/express/WxMaExpressAccount.java | 6 ++-- .../bean/express/WxMaExpressDelivery.java | 6 ++-- .../bean/express/WxMaExpressPrinter.java | 3 +- .../result/WxMaExpressOrderInfoResult.java | 6 ++-- .../WxMaPubTemplateTitleListResult.java | 2 -- .../bean/template/WxMaTemplateAddResult.java | 2 -- .../WxMaTemplateLibraryListResult.java | 2 -- .../api/impl/WxMaMsgServiceImplTest.java | 3 -- .../api/impl/WxMaShareServiceImplTest.java | 6 ---- .../wx/miniapp/bean/WxMaRunStepInfoTest.java | 1 - .../impl/WxMaRedissonConfigImplTest.java | 2 -- .../message/WxMaXmlOutMessageTest.java | 1 - .../WxMaUniformMessageGsonAdapterTest.java | 10 +++---- .../mp/api/impl/BaseWxMpServiceImpl.java | 20 +++++++------ .../mp/api/impl/WxMpAiOpenServiceImpl.java | 8 ++--- .../mp/api/impl/WxMpCardServiceImpl.java | 9 +++--- .../mp/api/impl/WxMpDeviceServiceImpl.java | 1 - .../mp/api/impl/WxMpMarketingServiceImpl.java | 7 ++--- .../api/impl/WxMpMassMessageServiceImpl.java | 1 - .../mp/api/impl/WxMpMaterialServiceImpl.java | 1 - .../mp/api/impl/WxMpMenuServiceImpl.java | 9 +++--- .../mp/api/impl/WxMpStoreServiceImpl.java | 6 ++-- .../api/impl/WxMpTemplateMsgServiceImpl.java | 9 +++--- .../impl/WxMpUserBlacklistServiceImpl.java | 1 - .../mp/api/impl/WxMpUserServiceImpl.java | 1 - .../mp/api/impl/WxMpUserTagServiceImpl.java | 4 +-- .../me/chanjar/weixin/mp/bean/card/Card.java | 1 - .../weixin/mp/bean/card/DiscountCard.java | 1 - .../chanjar/weixin/mp/bean/card/GiftCard.java | 1 - .../card/WxMpCardMpnewsGethtmlResult.java | 1 - .../mp/bean/comment/WxMpCommentListVo.java | 2 -- .../datacube/WxDataCubeArticleResult.java | 3 +- .../bean/datacube/WxDataCubeArticleTotal.java | 3 +- .../bean/datacube/WxDataCubeBaseResult.java | 2 -- .../datacube/WxDataCubeInterfaceResult.java | 3 +- .../mp/bean/datacube/WxDataCubeMsgResult.java | 3 +- .../bean/datacube/WxDataCubeUserCumulate.java | 7 ++--- .../bean/datacube/WxDataCubeUserSummary.java | 7 ++--- .../mp/bean/kefu/result/WxMpKfOnlineList.java | 1 - .../kefu/result/WxMpKfSessionGetResult.java | 1 - .../mp/bean/marketing/WxMpAdLeadResult.java | 5 ++-- .../mp/bean/marketing/WxMpUserActionSet.java | 5 ++-- .../chanjar/weixin/mp/bean/tag/WxUserTag.java | 6 ++-- .../weixin/mp/bean/template/WxMpTemplate.java | 6 ++-- .../mp/bean/wifi/WxMpWifiShopDataResult.java | 6 ++-- .../mp/bean/wifi/WxMpWifiShopListResult.java | 4 +-- .../weixin/mp/util/crypto/WxMpCryptUtil.java | 1 - .../impl/WxMpMarketingServiceImplTest.java | 2 -- .../mp/api/impl/WxMpUserServiceImplTest.java | 1 - .../WxMpMemberCardUpdateResultTest.java | 1 - .../menu/WxMpGetSelfMenuInfoResultTest.java | 1 - .../api/impl/WxOpenComponentServiceImpl.java | 8 ++--- .../weixin/open/bean/WxOpenCreateResult.java | 1 - .../open/bean/ma/WxOpenMaPreviewInfo.java | 2 -- .../MaQrCodeOkhttpRequestExecutor.java | 2 -- .../weixin/open/util/WxOpenCryptUtil.java | 1 - .../impl/WxOpenComponentServiceImplTest.java | 2 -- .../wxpay/bean/entpay/EntPayRequest.java | 1 - .../ProfitSharingFinishRequest.java | 1 - .../bean/result/WxPayRefundQueryResult.java | 8 ++--- .../wxpay/bean/result/WxPayRefundResult.java | 8 ++--- .../wxpay/service/PayScoreService.java | 2 -- .../impl/ProfitSharingServiceImpl.java | 2 -- .../impl/WxPayServiceApacheHttpImpl.java | 7 ++--- .../wxpay/v3/auth/WxPayCredentials.java | 2 -- .../wxpay/v3/auth/WxPayValidator.java | 3 +- .../wxpay/bean/entpay/EntPayRequestTest.java | 2 -- .../impl/ProfitSharingServiceImplTest.java | 3 -- 114 files changed, 229 insertions(+), 337 deletions(-) create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java diff --git a/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java b/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java index 4eaddadf2e..a7b02cae99 100644 --- a/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java +++ b/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java @@ -1,7 +1,6 @@ package cn.binarywang.wx.graal; import lombok.Data; -import lombok.extern.slf4j.Slf4j; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java index 32299f56fe..2c536c4241 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java @@ -1,7 +1,6 @@ package me.chanjar.weixin.common.util.http.apache; import me.chanjar.weixin.common.WxType; -import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java index 598278c78c..493295bc9e 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java @@ -1,7 +1,6 @@ package me.chanjar.weixin.common.util.http.apache; import me.chanjar.weixin.common.WxType; -import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; @@ -12,7 +11,6 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; -import org.jetbrains.annotations.NotNull; import java.io.IOException; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java index 193787a6bc..c549967e17 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java @@ -6,7 +6,6 @@ import jodd.http.ProxyInfo; import jodd.util.StringPool; import me.chanjar.weixin.common.WxType; -import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java index 09012692f5..4447bb268b 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java @@ -1,7 +1,6 @@ package me.chanjar.weixin.common.util.http.okhttp; import me.chanjar.weixin.common.WxType; -import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java new file mode 100644 index 0000000000..494e75a9ee --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java @@ -0,0 +1,23 @@ +package me.chanjar.weixin.common.util.json; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.stream.JsonReader; + +import java.io.Reader; + +public class GsonParser { + private static final JsonParser JSON_PARSER = new JsonParser(); + + public static JsonObject parse(String json){ + return JSON_PARSER.parse(json).getAsJsonObject(); + } + + public static JsonObject parse(Reader json){ + return JSON_PARSER.parse(json).getAsJsonObject(); + } + + public static JsonObject parse(JsonReader json){ + return JSON_PARSER.parse(json).getAsJsonObject(); + } +} diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java index 6f98b3d986..fd8819272c 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java @@ -1,6 +1,5 @@ package me.chanjar.weixin.common.api; -import org.testng.Assert; import org.testng.annotations.Test; import java.util.concurrent.TimeUnit; 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 5aa2336a71..94de03e555 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,6 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.bean.*; -import java.util.Calendar; import java.util.Date; import java.util.List; 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 9dd1333bfa..416d128d51 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 @@ -2,9 +2,7 @@ import com.google.common.base.Joiner; import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.WxJsapiSignature; @@ -20,6 +18,7 @@ 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.json.GsonParser; import me.chanjar.weixin.cp.api.*; import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult; import me.chanjar.weixin.cp.bean.WxCpMessage; @@ -110,7 +109,7 @@ public String getAgentJsapiTicket(boolean forceRefresh) throws WxErrorException synchronized (this.globalAgentJsapiTicketRefreshLock) { if (this.configStorage.isAgentJsapiTicketExpired()) { String responseContent = this.get(this.configStorage.getApiUrl(GET_AGENT_CONFIG_TICKET), null); - JsonObject jsonObject = new JsonParser().parse(responseContent).getAsJsonObject(); + JsonObject jsonObject = GsonParser.parse(responseContent); this.configStorage.updateAgentJsapiTicket(jsonObject.get("ticket").getAsString(), jsonObject.get("expires_in").getAsInt()); } @@ -135,7 +134,7 @@ public String getJsapiTicket(boolean forceRefresh) throws WxErrorException { synchronized (this.globalJsapiTicketRefreshLock) { if (this.configStorage.isJsapiTicketExpired()) { String responseContent = this.get(this.configStorage.getApiUrl(GET_JSAPI_TICKET), null); - JsonObject tmpJsonObject = new JsonParser().parse(responseContent).getAsJsonObject(); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); this.configStorage.updateJsapiTicket(tmpJsonObject.get("ticket").getAsString(), tmpJsonObject.get("expires_in").getAsInt()); } @@ -191,8 +190,8 @@ public WxCpMaJsCode2SessionResult jsCode2Session(String jsCode) throws WxErrorEx @Override public String[] getCallbackIp() throws WxErrorException { String responseContent = get(this.configStorage.getApiUrl(GET_CALLBACK_IP), null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - JsonArray jsonArray = tmpJsonElement.getAsJsonObject().get("ip_list").getAsJsonArray(); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); + JsonArray jsonArray = tmpJsonObject.get("ip_list").getAsJsonArray(); String[] ips = new String[jsonArray.size()]; for (int i = 0; i < jsonArray.size(); i++) { ips[i] = jsonArray.get(i).getAsString(); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java index dea647f3f9..2f5872b04d 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java @@ -2,7 +2,6 @@ import com.google.common.base.Joiner; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.WxType; @@ -15,6 +14,7 @@ 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.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpTpService; import me.chanjar.weixin.cp.bean.*; import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; @@ -119,7 +119,7 @@ public WxCpTpCorp getPermanentCode(String authCode) throws WxErrorException { jsonObject.addProperty("auth_code", authCode); String result = post(configStorage.getApiUrl(GET_PERMANENT_CODE), jsonObject.toString()); - jsonObject = new JsonParser().parse(result).getAsJsonObject(); + jsonObject = GsonParser.parse(result); WxCpTpCorp wxCpTpCorp = WxCpTpCorp.fromJson(jsonObject.get("auth_corp_info").getAsJsonObject().toString()); wxCpTpCorp.setPermanentCode(jsonObject.get("permanent_code").getAsString()); return wxCpTpCorp; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java index 94aa977b25..d294c508fb 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.cp.api.impl; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpAgentService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpAgent; @@ -27,7 +27,7 @@ */ @RequiredArgsConstructor public class WxCpAgentServiceImpl implements WxCpAgentService { - private static final JsonParser JSON_PARSER = new JsonParser(); + private final WxCpService mainService; @@ -45,7 +45,7 @@ public WxCpAgent get(Integer agentId) throws WxErrorException { public void set(WxCpAgent agentInfo) throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(AGENT_SET); String responseContent = this.mainService.post(url, agentInfo.toJson()); - JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + JsonObject jsonObject = GsonParser.parse(responseContent); if (jsonObject.get("errcode").getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.CP)); } @@ -55,7 +55,7 @@ public void set(WxCpAgent agentInfo) throws WxErrorException { public List list() throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(AGENT_LIST); String responseContent = this.mainService.get(url, null); - JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + JsonObject jsonObject = GsonParser.parse(responseContent); if (jsonObject.get("errcode").getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.CP)); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java index b1f374c071..db85d2f251 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java @@ -1,14 +1,13 @@ package me.chanjar.weixin.cp.api.impl; -import com.google.gson.JsonParser; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.cp.api.WxCpChatService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpAppChatMessage; import me.chanjar.weixin.cp.bean.WxCpChat; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import org.apache.commons.lang3.StringUtils; @@ -25,7 +24,7 @@ */ @RequiredArgsConstructor public class WxCpChatServiceImpl implements WxCpChatService { - private static final JsonParser JSON_PARSER = new JsonParser(); + private final WxCpService cpService; @Override @@ -45,7 +44,7 @@ public String chatCreate(String name, String owner, List users, String c } final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_CREATE); String result = this.cpService.post(url, WxGsonBuilder.create().toJson(data)); - return new JsonParser().parse(result).getAsJsonObject().get("chatid").getAsString(); + return GsonParser.parse(result).get("chatid").getAsString(); } @Override @@ -87,7 +86,7 @@ public void update(String chatId, String name, String owner, List usersT public WxCpChat chatGet(String chatId) throws WxErrorException { final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_GET_CHATID + chatId); String result = this.cpService.get(url, null); - final String chatInfo = JSON_PARSER.parse(result).getAsJsonObject().getAsJsonObject("chat_info").toString(); + final String chatInfo = GsonParser.parse(result).getAsJsonObject("chat_info").toString(); return WxCpGsonBuilder.create().fromJson(chatInfo, WxCpChat.class); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java index fb2224e335..3a5ef87985 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java @@ -1,15 +1,14 @@ package me.chanjar.weixin.cp.api.impl; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; +import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; 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.cp.api.WxCpDepartmentService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpDepart; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.util.List; @@ -32,8 +31,8 @@ public class WxCpDepartmentServiceImpl implements WxCpDepartmentService { public Long create(WxCpDepart depart) throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(DEPARTMENT_CREATE); String responseContent = this.mainService.post(url, depart.toJson()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return GsonHelper.getAsLong(tmpJsonElement.getAsJsonObject().get("id")); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); + return GsonHelper.getAsLong(tmpJsonObject.get("id")); } @Override @@ -56,9 +55,9 @@ public List list(Long id) throws WxErrorException { } String responseContent = this.mainService.get(url, null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() - .fromJson(tmpJsonElement.getAsJsonObject().get("department"), + .fromJson(tmpJsonObject.get("department"), new TypeToken>() { }.getType() ); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java index 55579ff051..b83b6d39ab 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java @@ -6,10 +6,8 @@ import me.chanjar.weixin.common.util.fs.FileUtils; import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; -import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.cp.api.WxCpMediaService; import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import java.io.File; import java.io.IOException; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMenuServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMenuServiceImpl.java index 85abe71f45..d008e77083 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMenuServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMenuServiceImpl.java @@ -5,7 +5,6 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.api.WxCpMenuService; import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Menu.*; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java index 2005bc36eb..f271149ee9 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java @@ -1,24 +1,18 @@ package me.chanjar.weixin.cp.api.impl; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; -import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.URIUtil; import me.chanjar.weixin.common.util.json.GsonHelper; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpOAuth2Service; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo; import me.chanjar.weixin.cp.bean.WxCpUserDetail; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import static me.chanjar.weixin.common.api.WxConsts.OAuth2Scope.*; -import static me.chanjar.weixin.common.api.WxConsts.OAuth2Scope.SNSAPI_PRIVATEINFO; -import static me.chanjar.weixin.common.api.WxConsts.OAuth2Scope.SNSAPI_USERINFO; import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.OAuth2.*; /** @@ -74,8 +68,7 @@ public WxCpOauth2UserInfo getUserInfo(String code) throws WxErrorException { @Override public WxCpOauth2UserInfo getUserInfo(Integer agentId, String code) throws WxErrorException { String responseText = this.mainService.get(String.format(this.mainService.getWxCpConfigStorage().getApiUrl(GET_USER_INFO), code, agentId), null); - JsonElement je = new JsonParser().parse(responseText); - JsonObject jo = je.getAsJsonObject(); + JsonObject jo = GsonParser.parse(responseText); return WxCpOauth2UserInfo.builder() .userId(GsonHelper.getString(jo, "UserId")) 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 0484e1f62a..c626f6f562 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 @@ -1,13 +1,13 @@ package me.chanjar.weixin.cp.api.impl; import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import lombok.NonNull; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpOaService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.oa.*; @@ -64,10 +64,10 @@ 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()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("checkindata"), + tmpJson.get("checkindata"), new TypeToken>() { }.getType() ); @@ -94,11 +94,11 @@ public List getCheckinOption(Date datetime, List user final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_OPTION); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("info"), + tmpJson.get("info"), new TypeToken>() { }.getType() ); @@ -202,9 +202,9 @@ public List getDialRecord(Date startTime, Date endTime, Integer final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_DIAL_RECORD); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); - return WxCpGsonBuilder.create().fromJson(tmpJsonElement.getAsJsonObject().get("record"), + return WxCpGsonBuilder.create().fromJson(tmpJson.get("record"), new TypeToken>() { }.getType() ); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java index 016c880fd1..d886d31530 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java @@ -1,11 +1,11 @@ package me.chanjar.weixin.cp.api.impl; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -88,7 +88,7 @@ public String getAgentJsapiTicket(boolean forceRefresh) throws WxErrorException // 拿到锁之后,再次判断一下最新的token是否过期,避免重刷 if (getWxCpConfigStorage().isAgentJsapiTicketExpired()) { String responseContent = this.get(getWxCpConfigStorage().getApiUrl(GET_AGENT_CONFIG_TICKET), null); - JsonObject jsonObject = new JsonParser().parse(responseContent).getAsJsonObject(); + JsonObject jsonObject = GsonParser.parse(responseContent); getWxCpConfigStorage().updateAgentJsapiTicket(jsonObject.get("ticket").getAsString(), jsonObject.get("expires_in").getAsInt()); } @@ -112,7 +112,7 @@ public String getJsapiTicket(boolean forceRefresh) throws WxErrorException { // 拿到锁之后,再次判断一下最新的token是否过期,避免重刷 if (getWxCpConfigStorage().isJsapiTicketExpired()) { String responseContent = this.get(getWxCpConfigStorage().getApiUrl(GET_JSAPI_TICKET), null); - JsonObject tmpJsonObject = new JsonParser().parse(responseContent).getAsJsonObject(); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); getWxCpConfigStorage().updateJsapiTicket(tmpJsonObject.get("ticket").getAsString(), tmpJsonObject.get("expires_in").getAsInt()); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java index 753f2493a1..9a507e461f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java @@ -4,6 +4,7 @@ import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.api.WxCpTagService; import me.chanjar.weixin.cp.bean.WxCpTag; @@ -49,8 +50,8 @@ public String create(String tagName) throws WxErrorException { private String create(JsonObject param) throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(TAG_CREATE); String responseContent = this.mainService.post(url, param.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return tmpJsonElement.getAsJsonObject().get("tagid").getAsString(); + JsonObject jsonObject = GsonParser.parse(responseContent); + return jsonObject.get("tagid").getAsString(); } @Override @@ -72,10 +73,10 @@ public void delete(String tagId) throws WxErrorException { public List listAll() throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(TAG_LIST); String responseContent = this.mainService.get(url, null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("taglist"), + tmpJson.get("taglist"), new TypeToken>() { }.getType() ); @@ -85,10 +86,10 @@ public List listAll() throws WxErrorException { public List listUsersByTagId(String tagId) throws WxErrorException { String url = String.format(this.mainService.getWxCpConfigStorage().getApiUrl(TAG_GET), tagId); String responseContent = this.mainService.get(url, null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("userlist"), + tmpJson.get("userlist"), new TypeToken>() { }.getType() ); 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 97530a6e9d..3993960642 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 @@ -5,7 +5,6 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.api.WxCpTaskCardService; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import java.util.HashMap; import java.util.List; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java index 14e75125af..43df12657d 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java @@ -2,13 +2,13 @@ import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.HttpType; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import org.apache.http.Consts; @@ -76,7 +76,7 @@ public String getSuiteAccessToken(boolean forceRefresh) throws WxErrorException if (error.getErrorCode() != 0) { throw new WxErrorException(error); } - jsonObject = new JsonParser().parse(resultContent).getAsJsonObject(); + jsonObject = GsonParser.parse(resultContent); String suiteAccussToken = jsonObject.get("suite_access_token").getAsString(); Integer expiresIn = jsonObject.get("expires_in").getAsInt(); this.configStorage.updateSuiteAccessToken(suiteAccussToken, expiresIn); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java index b9844d39b9..1627117d26 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java @@ -5,6 +5,7 @@ import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.api.WxCpUserService; import me.chanjar.weixin.cp.bean.WxCpInviteResult; @@ -84,9 +85,9 @@ public List listByDepartment(Long departId, Boolean fetchChild, Intege String url = this.mainService.getWxCpConfigStorage().getApiUrl(USER_LIST + departId); String responseContent = this.mainService.get(url, params); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject jsonObject = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() - .fromJson(tmpJsonElement.getAsJsonObject().get("userlist"), + .fromJson(jsonObject.get("userlist"), new TypeToken>() { }.getType() ); @@ -107,10 +108,10 @@ public List listSimpleByDepartment(Long departId, Boolean fetchChild, String url = this.mainService.getWxCpConfigStorage().getApiUrl(USER_SIMPLE_LIST + departId); String responseContent = this.mainService.get(url, params); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("userlist"), + tmpJson.get("userlist"), new TypeToken>() { }.getType() ); @@ -158,14 +159,14 @@ public Map userId2Openid(String userId, Integer agentId) throws } String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); Map result = Maps.newHashMap(); - if (tmpJsonElement.getAsJsonObject().get("openid") != null) { - result.put("openid", tmpJsonElement.getAsJsonObject().get("openid").getAsString()); + if (tmpJson.get("openid") != null) { + result.put("openid", tmpJson.get("openid").getAsString()); } - if (tmpJsonElement.getAsJsonObject().get("appid") != null) { - result.put("appid", tmpJsonElement.getAsJsonObject().get("appid").getAsString()); + if (tmpJson.get("appid") != null) { + result.put("appid", tmpJson.get("appid").getAsString()); } return result; @@ -177,8 +178,8 @@ public String openid2UserId(String openid) throws WxErrorException { jsonObject.addProperty("openid", openid); String url = this.mainService.getWxCpConfigStorage().getApiUrl(USER_CONVERT_TO_USERID); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return tmpJsonElement.getAsJsonObject().get("userid").getAsString(); + JsonObject tmpJson = GsonParser.parse(responseContent); + return tmpJson.get("userid").getAsString(); } @Override @@ -187,8 +188,8 @@ public String getUserId(String mobile) throws WxErrorException { jsonObject.addProperty("mobile", mobile); String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_USER_ID); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return tmpJsonElement.getAsJsonObject().get("userid").getAsString(); + JsonObject tmpJson = GsonParser.parse(responseContent); + return tmpJson.get("userid").getAsString(); } @Override diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpInviteResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpInviteResult.java index ccf6fc94db..f5a0a66bf1 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpInviteResult.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpInviteResult.java @@ -1,12 +1,7 @@ package me.chanjar.weixin.cp.bean; import java.io.Serializable; -import java.util.Collections; -import java.util.List; -import org.apache.commons.lang3.StringUtils; - -import com.google.common.base.Splitter; import com.google.gson.annotations.SerializedName; import lombok.Data; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlMessage.java index f20f74b757..f39b062c08 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlMessage.java @@ -8,16 +8,7 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.util.XmlUtils; -import me.chanjar.weixin.common.util.crypto.WxCryptUtil; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; -import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder; -import me.chanjar.weixin.cp.config.WxCpConfigStorage; -import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; -import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; import me.chanjar.weixin.cp.util.xml.XStreamTransformer; /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java index 0e22b626b9..e7af1dd61a 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java @@ -8,13 +8,6 @@ import lombok.Data; import me.chanjar.weixin.common.util.XmlUtils; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; -import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder; -import me.chanjar.weixin.cp.config.WxCpConfigStorage; -import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; import me.chanjar.weixin.cp.util.xml.XStreamTransformer; /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java index ec86dea767..650171a41d 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java @@ -1,6 +1,5 @@ package me.chanjar.weixin.cp.bean; -import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpTemplateResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpTemplateResult.java index df25aabf37..b8dd2dbe91 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpTemplateResult.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpTemplateResult.java @@ -1,15 +1,12 @@ package me.chanjar.weixin.cp.bean.oa; -import com.google.gson.JsonObject; import com.google.gson.annotations.SerializedName; import lombok.Data; import me.chanjar.weixin.cp.bean.oa.templatedata.TemplateContent; -import me.chanjar.weixin.cp.bean.oa.templatedata.TemplateControls; import me.chanjar.weixin.cp.bean.oa.templatedata.TemplateTitle; import java.io.Serializable; import java.util.List; -import java.util.Map; /** * 审批模板详情 diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/TemplateControls.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/TemplateControls.java index bc9919ac3f..b9d463038e 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/TemplateControls.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/TemplateControls.java @@ -3,7 +3,6 @@ import lombok.Data; import java.io.Serializable; -import java.util.Map; /** * @author Administrator diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/control/TemplateAttendance.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/control/TemplateAttendance.java index 21dca126e9..7f641611a7 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/control/TemplateAttendance.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/control/TemplateAttendance.java @@ -5,7 +5,6 @@ import me.chanjar.weixin.cp.bean.oa.templatedata.TemplateDateRange; import java.io.Serializable; -import java.util.Map; /** * @author gyv12345@163.com 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 f18f8b7424..22cee8f405 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 @@ -8,7 +8,6 @@ import org.testng.annotations.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.testng.Assert.*; /** *
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java
index 1c489e3515..9f79735612 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java
@@ -2,21 +2,17 @@
 
 import com.google.gson.JsonObject;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.cp.api.WxCpService;
 import me.chanjar.weixin.cp.api.WxCpTpService;
 import me.chanjar.weixin.cp.bean.WxCpTpAuthInfo;
 import me.chanjar.weixin.cp.bean.WxCpTpCorp;
 import me.chanjar.weixin.cp.bean.WxCpTpPermanentCodeInfo;
 import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
 import me.chanjar.weixin.cp.config.impl.WxCpTpDefaultConfigImpl;
-import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
 import org.testng.annotations.Test;
 
 import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.GET_AUTH_INFO;
 import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.GET_PERMANENT_CODE;
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.*;
 import static org.testng.Assert.*;
 
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
index b785fc0aa3..97c7d40fe5 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
@@ -9,14 +9,12 @@
 import me.chanjar.weixin.cp.config.WxCpConfigStorage;
 import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
 import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
-import me.chanjar.weixin.cp.constant.WxCpConsts;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.contentOf;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertEquals;
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java
index 23c86768fd..1f565fbffa 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java
@@ -15,7 +15,6 @@
 import me.chanjar.weixin.cp.bean.Gender;
 import me.chanjar.weixin.cp.bean.WxCpInviteResult;
 import me.chanjar.weixin.cp.bean.WxCpUser;
-import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo;
 
 import static org.testng.Assert.*;
 
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java
index 7b0e75a58c..5a54bfd8af 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java
@@ -3,7 +3,6 @@
 import org.testng.annotations.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.*;
 
 /**
  * .
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
index 14d933da8a..b6dda81301 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
@@ -8,7 +8,6 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.Arrays;
 
 public class WxCpOAuth2Servlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
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 ac48ceda8e..19f9d36e99 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
@@ -7,7 +7,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.api.WxOcrService;
@@ -20,6 +19,7 @@
 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.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 
@@ -37,7 +37,7 @@
  */
 @Slf4j
 public abstract class BaseWxMaServiceImpl implements WxMaService, RequestHttp {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private WxMaConfig wxMaConfig;
 
   private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this);
@@ -94,7 +94,7 @@ public String getPaidUnionId(String openid, String transactionId, String mchId,
       throw new WxErrorException(error);
     }
 
-    return JSON_PARSER.parse(responseContent).getAsJsonObject().get("unionid").getAsString();
+    return GsonParser.parse(responseContent).get("unionid").getAsString();
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java
index 6eeffad2ea..db69642714 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java
@@ -10,10 +10,10 @@
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitTrend;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 import java.lang.reflect.Type;
@@ -26,7 +26,7 @@
  */
 @AllArgsConstructor
 public class WxMaAnalysisServiceImpl implements WxMaAnalysisService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private WxMaService wxMaService;
 
   @Override
@@ -106,7 +106,7 @@ private WxMaRetainInfo getRetainInfo(Date beginDate, Date endDate, String url) t
    */
   private  List getAnalysisResultAsList(String url, Date beginDate, Date endDate, Type returnType) throws WxErrorException {
     String responseContent = this.wxMaService.post(url, toJson(beginDate, endDate));
-    JsonObject response = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject response = GsonParser.parse(responseContent);
     boolean hasList = response.has("list");
     if (hasList) {
       return WxMaGsonBuilder.create().fromJson(response.getAsJsonArray("list"), returnType);
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCloudServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCloudServiceImpl.java
index 55a80704c2..300ded88fe 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCloudServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCloudServiceImpl.java
@@ -11,11 +11,11 @@
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 
@@ -31,7 +31,7 @@
 @Slf4j
 @RequiredArgsConstructor
 public class WxMaCloudServiceImpl implements WxMaCloudService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private final WxMaService wxMaService;
 
   @Override
@@ -44,7 +44,7 @@ public String invokeCloudFunction(String name, String body) throws WxErrorExcept
   public String invokeCloudFunction(String env, String name, String body) throws WxErrorException {
     String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv();
     final String response = this.wxMaService.post(String.format(INVOKE_CLOUD_FUNCTION_URL, cloudEnv, name), body);
-    return JSON_PARSER.parse(response).getAsJsonObject().get("resp_data").getAsString();
+    return GsonParser.parse(response).get("resp_data").getAsString();
   }
 
   @Override
@@ -59,8 +59,7 @@ public List add(String collection, List list) throws WxErrorException {
     params.addProperty("query", query);
 
     String responseContent = wxMaService.post(DATABASE_ADD_URL, params.toString());
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    JsonObject jsonObject = tmpJsonElement.getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent));
     }
@@ -84,8 +83,7 @@ public String add(String collection, Object obj) throws WxErrorException {
     params.addProperty("query", query);
 
     String responseContent = wxMaService.post(DATABASE_ADD_URL, params.toString());
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    JsonObject jsonObject = tmpJsonElement.getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent));
     }
@@ -102,7 +100,7 @@ public JsonArray databaseAdd(String query) throws WxErrorException {
   @Override
   public JsonArray databaseAdd(String env, String query) throws WxErrorException {
     String response = this.wxMaService.post(DATABASE_ADD_URL, ImmutableMap.of("env", env, "query", query));
-    return JSON_PARSER.parse(response).getAsJsonObject().get("id_list").getAsJsonArray();
+    return GsonParser.parse(response).get("id_list").getAsJsonArray();
   }
 
   @Override
@@ -116,8 +114,7 @@ public Integer delete(String collection, String whereJson) throws WxErrorExcepti
     params.addProperty("query", query);
 
     String responseContent = wxMaService.post(DATABASE_DELETE_URL, params.toString());
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    JsonObject jsonObject = tmpJsonElement.getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent));
     }
@@ -133,7 +130,7 @@ public int databaseDelete(String query) throws WxErrorException {
   @Override
   public int databaseDelete(String env, String query) throws WxErrorException {
     String response = this.wxMaService.post(DATABASE_DELETE_URL, ImmutableMap.of("env", env, "query", query));
-    return JSON_PARSER.parse(response).getAsJsonObject().get("deleted").getAsInt();
+    return GsonParser.parse(response).get("deleted").getAsInt();
   }
 
   @Override
@@ -214,7 +211,7 @@ public JsonArray databaseAggregate(String query) throws WxErrorException {
   @Override
   public JsonArray databaseAggregate(String env, String query) throws WxErrorException {
     String response = this.wxMaService.post(DATABASE_AGGREGATE_URL, ImmutableMap.of("env", env, "query", query));
-    return JSON_PARSER.parse(response).getAsJsonObject().get("data").getAsJsonArray();
+    return GsonParser.parse(response).get("data").getAsJsonArray();
   }
 
   @Override
@@ -228,7 +225,7 @@ public Long count(String collection, String whereJson) throws WxErrorException {
     params.addProperty("query", query);
 
     String responseContent = wxMaService.post(DATABASE_COUNT_URL, params.toString());
-    return JSON_PARSER.parse(responseContent).getAsJsonObject().get("count").getAsLong();
+    return GsonParser.parse(responseContent).get("count").getAsLong();
   }
 
   @Override
@@ -240,7 +237,7 @@ public Long databaseCount(String query) throws WxErrorException {
   @Override
   public Long databaseCount(String env, String query) throws WxErrorException {
     String response = this.wxMaService.post(DATABASE_COUNT_URL, ImmutableMap.of("env", env, "query", query));
-    return JSON_PARSER.parse(response).getAsJsonObject().get("count").getAsLong();
+    return GsonParser.parse(response).get("count").getAsLong();
   }
 
   @Override
@@ -283,7 +280,7 @@ public Long databaseMigrateImport(String env, String collectionName, String file
     params.addProperty("conflict_mode", conflictMode);
 
     String response = this.wxMaService.post(DATABASE_MIGRATE_IMPORT_URL, params.toString());
-    return JSON_PARSER.parse(response).getAsJsonObject().get("job_id").getAsLong();
+    return GsonParser.parse(response).get("job_id").getAsLong();
   }
 
   @Override
@@ -301,7 +298,7 @@ public Long databaseMigrateExport(String env, String filePath, int fileType, Str
     params.addProperty("query", query);
 
     String response = this.wxMaService.post(DATABASE_MIGRATE_EXPORT_URL, params.toString());
-    return JSON_PARSER.parse(response).getAsJsonObject().get("job_id").getAsLong();
+    return GsonParser.parse(response).get("job_id").getAsLong();
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java
index 2afdce5099..2d965b4c45 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java
@@ -9,6 +9,7 @@
 import java.util.List;
 
 import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.apache.commons.lang3.StringUtils;
 
 import cn.binarywang.wx.miniapp.api.WxMaCodeService;
@@ -20,7 +21,6 @@
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeVersionDistribution;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -34,7 +34,7 @@
  */
 @AllArgsConstructor
 public class WxMaCodeServiceImpl implements WxMaCodeService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private WxMaService wxMaService;
 
   @Override
@@ -73,7 +73,7 @@ public byte[] getQrCode(String path) throws WxErrorException {
   @Override
   public List getCategory() throws WxErrorException {
     String responseContent = this.wxMaService.get(GET_CATEGORY_URL, null);
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     boolean hasCategoryList = jsonObject.has("category_list");
     if (hasCategoryList) {
       return WxMaGsonBuilder.create().fromJson(jsonObject.getAsJsonArray("category_list"),
@@ -87,7 +87,7 @@ public List getCategory() throws WxErrorException {
   @Override
   public List getPage() throws WxErrorException {
     String responseContent = this.wxMaService.get(GET_PAGE_URL, null);
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     boolean hasPageList = jsonObject.has("page_list");
     if (hasPageList) {
       return WxMaGsonBuilder.create().fromJson(jsonObject.getAsJsonArray("page_list"),
@@ -101,7 +101,7 @@ public List getPage() throws WxErrorException {
   @Override
   public long submitAudit(WxMaCodeSubmitAuditRequest auditRequest) throws WxErrorException {
     String responseContent = this.wxMaService.post(SUBMIT_AUDIT_URL, auditRequest.toJson());
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     return GsonHelper.getLong(jsonObject, "auditid");
   }
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java
index ed5b375e24..a5c8376bc3 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java
@@ -2,14 +2,13 @@
 
 import cn.binarywang.wx.miniapp.api.WxMaJsapiService;
 import cn.binarywang.wx.miniapp.api.WxMaService;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.RandomUtils;
 import me.chanjar.weixin.common.util.crypto.SHA1;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.util.concurrent.locks.Lock;
 
@@ -22,7 +21,7 @@
  */
 @AllArgsConstructor
 public class WxMaJsapiServiceImpl implements WxMaJsapiService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   private WxMaService wxMaService;
 
@@ -42,8 +41,7 @@ public String getCardApiTicket(boolean forceRefresh) throws WxErrorException {
 
       if (this.wxMaService.getWxMaConfig().isCardApiTicketExpired()) {
         String responseContent = this.wxMaService.get(GET_JSAPI_TICKET_URL + "?type=wx_card", null);
-        JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-        JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
+        JsonObject tmpJsonObject = GsonParser.parse(responseContent);
         String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
         int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
         this.wxMaService.getWxMaConfig().updateCardApiTicket(jsapiTicket, expiresInSeconds);
@@ -70,8 +68,7 @@ public String getJsapiTicket(boolean forceRefresh) throws WxErrorException {
 
       if (this.wxMaService.getWxMaConfig().isJsapiTicketExpired()) {
         String responseContent = this.wxMaService.get(GET_JSAPI_TICKET_URL + "?type=jsapi", null);
-        JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-        JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
+        JsonObject tmpJsonObject = GsonParser.parse(responseContent);
         String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
         int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
         this.wxMaService.getWxMaConfig().updateJsapiTicket(jsapiTicket, expiresInSeconds);
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
index f20e0fc288..8e6a3f2caa 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
@@ -14,6 +14,7 @@
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.io.Serializable;
 import java.util.HashMap;
@@ -29,7 +30,6 @@
  */
 @AllArgsConstructor
 public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
 
   private WxMaService wxMaService;
 
@@ -38,7 +38,7 @@ public WxMaLiveResult addGoods(WxMaLiveInfo.Goods goods) throws WxErrorException
     Map map = new HashMap<>(2);
     map.put("goodsInfo", goods);
     String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -51,7 +51,7 @@ public boolean resetAudit(Integer auditId, Integer goodsId) throws WxErrorExcept
     map.put("auditId", auditId);
     map.put("goodsId", goodsId);
     String responseContent = this.wxMaService.post(RESET_AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -63,7 +63,7 @@ public String auditGoods(Integer goodsId) throws WxErrorException {
     Map map = new HashMap<>(2);
     map.put("goodsId", goodsId);
     String responseContent = this.wxMaService.post(AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -75,7 +75,7 @@ public boolean deleteGoods(Integer goodsId) throws WxErrorException {
     Map map = new HashMap<>(2);
     map.put("goodsId", goodsId);
     String responseContent = this.wxMaService.post(DELETE_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -87,7 +87,7 @@ public boolean updateGoods(WxMaLiveInfo.Goods goods) throws WxErrorException {
     Map map = new HashMap<>(2);
     map.put("goodsInfo", goods);
     String responseContent = this.wxMaService.post(UPDATE_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -99,7 +99,7 @@ public WxMaLiveResult getGoodsWareHouse(List goodsIds) throws WxErrorEx
     Map map = new HashMap<>(2);
     map.put("goods_ids", goodsIds);
     String responseContent = this.wxMaService.post(GET_GOODS_WARE_HOUSE, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -110,7 +110,7 @@ public WxMaLiveResult getGoodsWareHouse(List goodsIds) throws WxErrorEx
   public WxMaLiveResult getApprovedGoods(Integer offset, Integer limit, Integer status) throws WxErrorException {
     ImmutableMap params = ImmutableMap.of("status", status, "offset", offset, "limit", limit);
     String responseContent = wxMaService.get(GET_APPROVED_GOODS, Joiner.on("&").withKeyValueSeparator("=").join(params));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
index 4e88577697..a5238ef086 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
@@ -6,12 +6,12 @@
 import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -28,13 +28,12 @@
 @Slf4j
 @AllArgsConstructor
 public class WxMaLiveServiceImpl implements WxMaLiveService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
   private final WxMaService wxMaService;
 
   @Override
   public Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorException {
     String responseContent = this.wxMaService.post(CREATE_ROOM, WxMaGsonBuilder.create().toJson(roomInfo));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -95,7 +94,7 @@ public boolean addGoodsToRoom(Integer roomId, List goodsIds) throws WxE
     map.put("roomId", roomId);
     map.put("ids", goodsIds);
     String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -104,12 +103,12 @@ public boolean addGoodsToRoom(Integer roomId, List goodsIds) throws WxE
 
   private JsonObject getLiveInfo(Integer start, Integer limit, Map map) throws WxErrorException {
     if (map == null) {
-      map = new HashMap<>(2);
+      map = new HashMap(2);
     }
     map.put("start", start);
     map.put("limit", limit);
     String responseContent = wxMaService.post(GET_LIVE_INFO, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
index c9e229e9ef..50747a8206 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
@@ -6,18 +6,18 @@
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 /**
  * @author Binary Wang
  */
 @AllArgsConstructor
 public class WxMaMsgServiceImpl implements WxMaMsgService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private WxMaService wxMaService;
 
   @Override
@@ -29,7 +29,7 @@ public boolean sendKefuMsg(WxMaKefuMessage message) throws WxErrorException {
   @Override
   public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException {
     String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson());
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -38,7 +38,7 @@ public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorE
   @Override
   public void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException {
     String responseContent = this.wxMaService.post(SUBSCRIBE_MSG_SEND_URL, subscribeMessage.toJson());
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -47,7 +47,7 @@ public void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErr
   @Override
   public void sendUniformMsg(WxMaUniformMessage uniformMessage) throws WxErrorException {
     String responseContent = this.wxMaService.post(UNIFORM_MSG_SEND_URL, uniformMessage.toJson());
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -56,7 +56,7 @@ public void sendUniformMsg(WxMaUniformMessage uniformMessage) throws WxErrorExce
   @Override
   public JsonObject createUpdatableMessageActivityId() throws WxErrorException {
     final String responseContent = this.wxMaService.get(ACTIVITY_ID_CREATE_URL, null);
-    return JSON_PARSER.parse(responseContent).getAsJsonObject();
+    return GsonParser.parse(responseContent);
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
index ffd54b3b10..8682612a9b 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
@@ -6,10 +6,10 @@
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
@@ -36,7 +36,7 @@ public WxMaPubTemplateTitleListResult getPubTemplateTitleList(String[] ids, int
   public List getPubTemplateKeyWordsById(String id) throws WxErrorException {
     String responseText = this.wxMaService.get(GET_PUB_TEMPLATE_KEY_WORDS_BY_ID_URL,
       Joiner.on("&").withKeyValueSeparator("=").join(ImmutableMap.of("tid", id)));
-    return WxMaGsonBuilder.create().fromJson(new JsonParser().parse(responseText).getAsJsonObject()
+    return WxMaGsonBuilder.create().fromJson(GsonParser.parse(responseText)
       .getAsJsonArray("data"), new TypeToken>() {
     }.getType());
   }
@@ -46,13 +46,13 @@ public String addTemplate(String id, List keywordIdList, String sceneDe
     String responseText = this.wxMaService.post(TEMPLATE_ADD_URL, ImmutableMap.of("tid", id,
       "kidList", keywordIdList.toArray(),
       "sceneDesc", sceneDesc));
-    return new JsonParser().parse(responseText).getAsJsonObject().get("priTmplId").getAsString();
+    return GsonParser.parse(responseText).get("priTmplId").getAsString();
   }
 
   @Override
   public List getTemplateList() throws WxErrorException {
     String responseText = this.wxMaService.get(TEMPLATE_LIST_URL, null);
-    return WxMaGsonBuilder.create().fromJson(new JsonParser().parse(responseText).getAsJsonObject()
+    return WxMaGsonBuilder.create().fromJson(GsonParser.parse(responseText)
       .getAsJsonArray("data"), new TypeToken>() {
     }.getType());
   }
@@ -66,7 +66,7 @@ public boolean delTemplate(String templateId) throws WxErrorException {
   @Override
   public List getCategory() throws WxErrorException {
     String responseText = this.wxMaService.get(GET_CATEGORY_URL, null);
-    return WxMaGsonBuilder.create().fromJson(new JsonParser().parse(responseText).getAsJsonObject()
+    return WxMaGsonBuilder.create().fromJson(GsonParser.parse(responseText)
       .getAsJsonArray("data"), new TypeToken>() {
     }.getType());
   }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfo.java
index 8a9d7ea777..5e6ff641c4 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfo.java
@@ -5,9 +5,9 @@
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 /**
  * 微信运动步数信息.
@@ -16,7 +16,7 @@
  */
 @Data
 public class WxMaRunStepInfo implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -7496372171398607044L;
 
   /**
@@ -30,7 +30,7 @@ public class WxMaRunStepInfo implements Serializable {
   private Integer step;
 
   public static List fromJson(String json) {
-    JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     return WxMaGsonBuilder.create().fromJson(jsonObject.get("stepInfoList").toString(),
       new TypeToken>() {
       }.getType());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/cloud/WxCloudDatabaseCreateIndexRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/cloud/WxCloudDatabaseCreateIndexRequest.java
index fbdba099f7..9b551db255 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/cloud/WxCloudDatabaseCreateIndexRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/cloud/WxCloudDatabaseCreateIndexRequest.java
@@ -1,6 +1,5 @@
 package cn.binarywang.wx.miniapp.bean.cloud;
 
-import lombok.Builder;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressAccount.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressAccount.java
index a3f22b6a4a..950bda3066 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressAccount.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressAccount.java
@@ -2,12 +2,12 @@
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.io.Serializable;
 import java.util.List;
@@ -24,7 +24,7 @@
 @AllArgsConstructor
 public class WxMaExpressAccount implements Serializable {
 
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -4991983596742569736L;
 
   /**
@@ -95,7 +95,7 @@ public class WxMaExpressAccount implements Serializable {
   private List serviceType;
 
   public static List fromJsonList(String json) {
-    JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     return WxMaGsonBuilder.create().fromJson(jsonObject.get("list").toString(),
       new TypeToken>() {
       }.getType());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java
index b23bc4c416..dbdb02c113 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java
@@ -2,12 +2,12 @@
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.io.Serializable;
 import java.util.List;
@@ -23,7 +23,7 @@
 @NoArgsConstructor
 @AllArgsConstructor
 public class WxMaExpressDelivery implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -8394544895730223810L;
 
   /**
@@ -63,7 +63,7 @@ public class WxMaExpressDelivery implements Serializable {
   private List serviceType;
 
   public static List fromJson(String json) {
-    JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     return WxMaGsonBuilder.create().fromJson(jsonObject.get("data").toString(),
       new TypeToken>() {
       }.getType());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java
index 764f2ac894..b41d33305c 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java
@@ -1,7 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express;
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -22,7 +21,7 @@
 @AllArgsConstructor
 public class WxMaExpressPrinter implements Serializable {
 
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = 7164449984700322531L;
 
   /**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java
index 8a25950a96..fb47057d87 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java
@@ -2,12 +2,12 @@
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.io.Serializable;
 import java.util.List;
@@ -24,7 +24,7 @@
 @NoArgsConstructor
 @AllArgsConstructor
 public class WxMaExpressOrderInfoResult implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -9166603059965942285L;
 
   /**
@@ -66,7 +66,7 @@ public static WxMaExpressOrderInfoResult fromJson(String json) {
   }
 
   public static List toList(String json) {
-    JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     return WxMaGsonBuilder.create().fromJson(jsonObject.get("order_list").toString(),
       new TypeToken>() {
       }.getType());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java
index 21fab6afa2..d2dacc6e61 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java
@@ -1,8 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.template;
 
-import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java
index eb64920cd2..e9f68c0973 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java
@@ -1,9 +1,7 @@
 package cn.binarywang.wx.miniapp.bean.template;
 
 import com.google.gson.annotations.SerializedName;
-import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java
index f32832d349..0714378b96 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java
@@ -1,9 +1,7 @@
 package cn.binarywang.wx.miniapp.bean.template;
 
 import com.google.gson.annotations.SerializedName;
-import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
index 3ca42b46fc..554ac1da97 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
@@ -1,6 +1,5 @@
 package cn.binarywang.wx.miniapp.api.impl;
 
-import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.*;
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
 import org.testng.annotations.*;
@@ -12,8 +11,6 @@
 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.text.SimpleDateFormat;
 import java.util.Date;
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImplTest.java
index abd92bb770..dcf3726e33 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImplTest.java
@@ -1,19 +1,13 @@
 package cn.binarywang.wx.miniapp.api.impl;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import cn.binarywang.wx.miniapp.bean.WxMaShareInfo;
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.binarywang.wx.miniapp.test.ApiTestModule;
-import cn.binarywang.wx.miniapp.test.TestConfig;
-import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
-import me.chanjar.weixin.common.error.WxErrorException;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
 
 /**
  * 测试分享相关的接口
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfoTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfoTest.java
index ef09e0731c..bbc87394d2 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfoTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfoTest.java
@@ -5,7 +5,6 @@
 import org.testng.annotations.*;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.*;
 
 /**
  * 
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImplTest.java
index d4fb45963d..6fdcee10f4 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImplTest.java
@@ -1,13 +1,11 @@
 package cn.binarywang.wx.miniapp.config.impl;
 
-import cn.binarywang.wx.miniapp.config.WxMaConfig;
 import lombok.SneakyThrows;
 import org.redisson.Redisson;
 import org.redisson.api.RedissonClient;
 import org.redisson.config.Config;
 import org.redisson.config.TransportMode;
 import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java
index f07c57b120..f6f775b6f6 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java
@@ -4,7 +4,6 @@
 import org.testng.annotations.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.*;
 
 public class WxMaXmlOutMessageTest {
 
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java
index c28711ab81..1ae60070cd 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java
@@ -2,7 +2,7 @@
 
 import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
 import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
-import com.google.gson.JsonParser;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.testng.annotations.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -33,7 +33,7 @@ public void testSerialize_mp() {
       .addData(new WxMaTemplateData("keyword3", "2014年9月22日", "#173177"))
       .addData(new WxMaTemplateData("remark", "欢迎再次购买!", "#173177"));
 
-    assertThat(message.toJson()).isEqualTo(new JsonParser().parse("{\n" +
+    assertThat(message.toJson()).isEqualTo(GsonParser.parse("{\n" +
       "    \"touser\":\"OPENID\",\n" +
       "    \"mp_template_msg\":{\n" +
       "        \"appid\":\"APPID\",\n" +
@@ -66,7 +66,7 @@ public void testSerialize_mp() {
       "            }\n" +
       "        }\n" +
       "    }\n" +
-      "}").getAsJsonObject().toString());
+      "}").toString());
   }
 
   @Test
@@ -84,7 +84,7 @@ public void testSerialize_ma() {
       .addData(new WxMaTemplateData("keyword3", "腾讯微信总部"))
       .addData(new WxMaTemplateData("keyword4", "广州市海珠区新港中路397号"));
 
-    assertThat(message.toJson()).isEqualTo(new JsonParser().parse("{\n" +
+    assertThat(message.toJson()).isEqualTo(GsonParser.parse("{\n" +
       "    \"touser\":\"OPENID\",\n" +
       "    \"weapp_template_msg\":{\n" +
       "        \"template_id\":\"TEMPLATE_ID\",\n" +
@@ -106,6 +106,6 @@ public void testSerialize_ma() {
       "        },\n" +
       "        \"emphasis_keyword\":\"keyword1.DATA\"\n" +
       "    }\n" +
-      "}").getAsJsonObject().toString());
+      "}").toString());
   }
 }
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 0f2cb403ec..7cd4e402e6 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
@@ -3,9 +3,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +21,7 @@
 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.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import me.chanjar.weixin.mp.api.*;
 import me.chanjar.weixin.mp.bean.WxMpSemanticQuery;
@@ -48,7 +47,7 @@
  */
 @Slf4j
 public abstract class BaseWxMpServiceImpl implements WxMpService, RequestHttp {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   protected WxSessionManager sessionManager = new StandardSessionManager();
   private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this);
@@ -111,7 +110,7 @@ public String getTicket(TicketType type, boolean forceRefresh) throws WxErrorExc
       if (this.getWxMpConfigStorage().isTicketExpired(type)) {
         String responseContent = execute(SimpleGetRequestExecutor.create(this),
           GET_TICKET_URL.getUrl(this.getWxMpConfigStorage()) + type.getCode(), null);
-        JsonObject tmpJsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+        JsonObject tmpJsonObject = GsonParser.parse(responseContent);
         String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
         int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
         this.getWxMpConfigStorage().updateTicket(type, jsapiTicket, expiresInSeconds);
@@ -166,8 +165,7 @@ public String shortUrl(String longUrl) throws WxErrorException {
     o.addProperty("action", "long2short");
     o.addProperty("long_url", longUrl);
     String responseContent = this.post(SHORTURL_API_URL, o.toString());
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    return tmpJsonElement.getAsJsonObject().get("short_url").getAsString();
+    return GsonParser.parse(responseContent).get("short_url").getAsString();
   }
 
   @Override
@@ -245,8 +243,8 @@ public boolean oauth2validateAccessToken(WxMpOAuth2AccessToken token) {
   @Override
   public String[] getCallbackIP() throws WxErrorException {
     String responseContent = this.get(GET_CALLBACK_IP_URL, null);
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    JsonArray ipList = tmpJsonElement.getAsJsonObject().get("ip_list").getAsJsonArray();
+    JsonObject tmpJsonObject = GsonParser.parse(responseContent);
+    JsonArray ipList = tmpJsonObject.get("ip_list").getAsJsonArray();
     String[] ipArray = new String[ipList.size()];
     for (int i = 0; i < ipList.size(); i++) {
       ipArray[i] = ipList.get(i).getAsString();
@@ -434,7 +432,11 @@ public void setMultiConfigStorages(Map configStorages
   @Override
   public void addConfigStorage(String mpId, WxMpConfigStorage configStorages) {
     synchronized (this) {
-      this.configStorageMap.put(mpId, configStorages);
+      if (this.configStorageMap == null) {
+        this.setWxMpConfigStorage(configStorages);
+      } else {
+        this.configStorageMap.put(mpId, configStorages);
+      }
     }
   }
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
index 5ac3be31fd..831fc2a4ce 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
@@ -1,10 +1,10 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpAiOpenService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.enums.AiLangType;
@@ -23,7 +23,7 @@
  */
 @RequiredArgsConstructor
 public class WxMpAiOpenServiceImpl implements WxMpAiOpenService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private final WxMpService wxMpService;
 
   @Override
@@ -53,7 +53,7 @@ public String translate(AiLangType langFrom, AiLangType langTo, String content)
       throw new WxErrorException(error);
     }
 
-    return JSON_PARSER.parse(response).getAsJsonObject().get("to_content").getAsString();
+    return GsonParser.parse(response).get("to_content").getAsString();
   }
 
   @Override
@@ -69,6 +69,6 @@ public String queryRecognitionResult(String voiceId, AiLangType lang) throws WxE
       throw new WxErrorException(error);
     }
 
-    return JSON_PARSER.parse(response).getAsJsonObject().get("result").getAsString();
+    return GsonParser.parse(response).get("result").getAsString();
   }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
index faba08acd8..1e179c70f5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
@@ -9,6 +9,7 @@
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.RandomUtils;
 import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import me.chanjar.weixin.mp.api.WxMpCardService;
 import me.chanjar.weixin.mp.api.WxMpService;
@@ -58,8 +59,7 @@ public String getCardApiTicket(boolean forceRefresh) throws WxErrorException {
       if (this.getWxMpService().getWxMpConfigStorage().isTicketExpired(type)) {
         String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor
           .create(this.getWxMpService().getRequestHttp()), WxMpApiUrl.Card.CARD_GET_TICKET, null);
-        JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
-        JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
+        JsonObject tmpJsonObject = GsonParser.parse(responseContent);
         String cardApiTicket = tmpJsonObject.get("ticket").getAsString();
         int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
         this.getWxMpService().getWxMpConfigStorage().updateTicket(type, cardApiTicket, expiresInSeconds);
@@ -99,8 +99,7 @@ public String decryptCardCode(String encryptCode) throws WxErrorException {
     JsonObject param = new JsonObject();
     param.addProperty("encrypt_code", encryptCode);
     String responseContent = this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_DECRYPT, param.toString());
-    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
-    JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
+    JsonObject tmpJsonObject = GsonParser.parse(responseContent);
     JsonPrimitive jsonPrimitive = tmpJsonObject.getAsJsonPrimitive("code");
     return jsonPrimitive.getAsString();
   }
@@ -159,7 +158,7 @@ public String getCardDetail(String cardId) throws WxErrorException {
     String responseContent = this.wxMpService.post(WxMpApiUrl.Card.CARD_GET, param.toString());
 
     // 判断返回值
-    JsonObject json = (new JsonParser()).parse(responseContent).getAsJsonObject();
+    JsonObject json = GsonParser.parse(responseContent);
     String errcode = json.get("errcode").getAsString();
     if (!"0".equals(errcode)) {
       String errmsg = json.get("errmsg").getAsString();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDeviceServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDeviceServiceImpl.java
index 3aa122a533..0f7b807dea 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDeviceServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDeviceServiceImpl.java
@@ -6,7 +6,6 @@
 import me.chanjar.weixin.mp.api.WxMpDeviceService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.device.*;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Device.*;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImpl.java
index 6ec51e744f..c3dff12659 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImpl.java
@@ -1,12 +1,11 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpMarketingService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.marketing.WxMpAdLeadFilter;
@@ -38,8 +37,8 @@ public long addUserActionSets(String type, String name, String description) thro
     json.addProperty("name", name);
     json.addProperty("description", description);
     String responseContent = wxMpService.post(USER_ACTION_SETS_ADD, json.toString());
-    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
-    return tmpJsonElement.getAsJsonObject().get("data").getAsJsonObject().get("user_action_set_id").getAsLong();
+    JsonObject tmpJson = GsonParser.parse(responseContent);
+    return tmpJson.get("data").getAsJsonObject().get("user_action_set_id").getAsLong();
   }
 
   @Override
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java
index dcae606da7..462604cb02 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java
@@ -11,7 +11,6 @@
 import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
 import me.chanjar.weixin.mp.bean.result.WxMpMassSpeedGetResult;
 import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.*;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
index 4b852c03fe..bf37f2c414 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
@@ -13,7 +13,6 @@
 import me.chanjar.weixin.mp.api.WxMpMaterialService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.material.*;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 import me.chanjar.weixin.mp.util.requestexecuter.material.*;
 import me.chanjar.weixin.mp.util.requestexecuter.media.MediaImgUploadRequestExecutor;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java
index 2a42a0a590..5631a44f7e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java
@@ -1,11 +1,11 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.bean.menu.WxMenu;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpMenuService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.menu.WxMpGetSelfMenuInfoResult;
@@ -38,7 +38,7 @@ public String menuCreate(WxMenu menu) throws WxErrorException {
     log.debug("创建菜单:{},结果:{}", menuJson, result);
 
     if (menu.getMatchRule() != null) {
-      return new JsonParser().parse(result).getAsJsonObject().get("menuid").getAsString();
+      return GsonParser.parse(result).get("menuid").getAsString();
     }
 
     return null;
@@ -46,8 +46,7 @@ public String menuCreate(WxMenu menu) throws WxErrorException {
 
   @Override
   public String menuCreate(String json) throws WxErrorException {
-    JsonParser jsonParser = new JsonParser();
-    JsonObject jsonObject = jsonParser.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     WxMpApiUrl.Menu url = MENU_CREATE;
     if (jsonObject.get("matchrule") != null) {
       url = MENU_ADDCONDITIONAL;
@@ -55,7 +54,7 @@ public String menuCreate(String json) throws WxErrorException {
 
     String result = this.wxMpService.post(url, json);
     if (jsonObject.get("matchrule") != null) {
-      return jsonParser.parse(result).getAsJsonObject().get("menuid").getAsString();
+      return GsonParser.parse(result).get("menuid").getAsString();
     }
 
     return null;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
index 913816595c..58b48e9c7a 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
@@ -1,13 +1,13 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.BeanUtils;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.WxMpStoreService;
 import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo;
@@ -47,7 +47,7 @@ public WxMpStoreBaseInfo get(String poiId) throws WxErrorException {
     if (wxError.getErrorCode() != 0) {
       throw new WxErrorException(wxError);
     }
-    return WxMpStoreBaseInfo.fromJson(new JsonParser().parse(response).getAsJsonObject()
+    return WxMpStoreBaseInfo.fromJson(GsonParser.parse(response)
       .get("business").getAsJsonObject().get("base_info").toString());
   }
 
@@ -117,7 +117,7 @@ public List listCategories() throws WxErrorException {
     }
 
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(response).getAsJsonObject().get("category_list"),
+      GsonParser.parse(response).get("category_list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
index daaf60c2f3..f2da7571f7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
@@ -1,17 +1,16 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.WxMpTemplateMsgService;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 
 import java.util.List;
 
@@ -26,14 +25,14 @@
  */
 @RequiredArgsConstructor
 public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   private final WxMpService wxMpService;
 
   @Override
   public String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException {
     String responseContent = this.wxMpService.post(MESSAGE_TEMPLATE_SEND, templateMessage.toJson());
-    final JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    final JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() == 0) {
       return jsonObject.get("msgid").getAsString();
     }
@@ -62,7 +61,7 @@ public String addTemplate(String shortTemplateId) throws WxErrorException {
     JsonObject jsonObject = new JsonObject();
     jsonObject.addProperty("template_id_short", shortTemplateId);
     String responseContent = this.wxMpService.post(TEMPLATE_API_ADD_TEMPLATE, jsonObject.toString());
-    final JsonObject result = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    final JsonObject result = GsonParser.parse(responseContent);
     if (result.get("errcode").getAsInt() == 0) {
       return result.get("template_id").getAsString();
     }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java
index cd7ac541ae..a3c065e4d4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java
@@ -7,7 +7,6 @@
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.WxMpUserBlacklistService;
 import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.HashMap;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java
index 0c77a93ffc..03c83e3b45 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java
@@ -9,7 +9,6 @@
 import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
 import me.chanjar.weixin.mp.bean.result.WxMpUserList;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.HashMap;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
index bf4696e497..1d2013fd3f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
@@ -2,12 +2,12 @@
 
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.WxMpUserTagService;
 import me.chanjar.weixin.mp.bean.tag.WxTagListUser;
@@ -134,7 +134,7 @@ public List userTagList(String openid) throws WxErrorException {
     String responseContent = this.wxMpService.post(TAGS_GETIDLIST, json.toString());
 
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(responseContent).getAsJsonObject().get("tagid_list"),
+      GsonParser.parse(responseContent).get("tagid_list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
index 506101089c..6e0f32edc4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
@@ -2,7 +2,6 @@
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
index b1becbd642..60c7c911bd 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
@@ -1,6 +1,5 @@
 package me.chanjar.weixin.mp.bean.card;
 
-import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
index 0bfb5359ba..1712b19eb7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
@@ -1,6 +1,5 @@
 package me.chanjar.weixin.mp.bean.card;
 
-import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java
index d55950666e..13db310d5b 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java
@@ -6,7 +6,6 @@
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
-import java.util.List;
 
 
 @Data
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java
index 2110546594..10d1dafcad 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java
@@ -2,8 +2,6 @@
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.common.util.xml.IntegerArrayConverter;
-import me.chanjar.weixin.mp.bean.device.WxDeviceQrCodeResult;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
index f625072f80..d90aba2e36 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
@@ -6,6 +6,7 @@
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -116,7 +117,7 @@ public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
index 722b6c252e..bb732c34d7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
@@ -6,6 +6,7 @@
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -42,7 +43,7 @@ public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
index f86035c6b5..0e9051d231 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
@@ -2,7 +2,6 @@
 
 import java.io.Serializable;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
@@ -18,7 +17,6 @@
 @Data
 public abstract class WxDataCubeBaseResult implements Serializable {
   private static final long serialVersionUID = 8780389911053297600L;
-  protected static final JsonParser JSON_PARSER = new JsonParser();
 
   /**
    * ref_date.
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
index 0207d288b2..0cc54c7cc9 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
@@ -4,6 +4,7 @@
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.List;
@@ -57,7 +58,7 @@ public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
index b8796009d6..c556e51758 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
@@ -4,6 +4,7 @@
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.List;
@@ -70,7 +71,7 @@ public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
index f26ac12596..c278861dc5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
@@ -4,10 +4,9 @@
 import java.util.Date;
 import java.util.List;
 
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -20,7 +19,7 @@
  */
 @Data
 public class WxDataCubeUserCumulate implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   private static final long serialVersionUID = -3570981300225093657L;
 
@@ -30,7 +29,7 @@ public class WxDataCubeUserCumulate implements Serializable {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
index 4d28c7b992..75df60c55f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
@@ -4,10 +4,9 @@
 import java.util.Date;
 import java.util.List;
 
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -20,7 +19,7 @@
 public class WxDataCubeUserSummary implements Serializable {
   private static final long serialVersionUID = -2336654489906694173L;
 
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   private Date refDate;
 
@@ -32,7 +31,7 @@ public class WxDataCubeUserSummary implements Serializable {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
index 7f7b7db86f..555ee9dba2 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
@@ -3,7 +3,6 @@
 import java.io.Serializable;
 import java.util.List;
 
-import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
index 2b833aa20f..785e2126d4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
@@ -2,7 +2,6 @@
 
 import java.io.Serializable;
 
-import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpAdLeadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpAdLeadResult.java
index 61805018b0..7ce44ddbe2 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpAdLeadResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpAdLeadResult.java
@@ -1,9 +1,9 @@
 package me.chanjar.weixin.mp.bean.marketing;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
@@ -15,7 +15,6 @@
 @Data
 public class WxMpAdLeadResult implements Serializable {
   private static final long serialVersionUID = -1526796632563660821L;
-  protected static final JsonParser JSON_PARSER = new JsonParser();
 
   @SerializedName("page_info")
   private WxMpAdLeadPageInfo pageInfo;
@@ -25,7 +24,7 @@ public class WxMpAdLeadResult implements Serializable {
   public static WxMpAdLeadResult fromJson(String json) {
 
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("data"),
+      GsonParser.parse(json).get("data"),
       new TypeToken() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpUserActionSet.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpUserActionSet.java
index 84b0f4bba0..1bf41b4871 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpUserActionSet.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpUserActionSet.java
@@ -1,9 +1,9 @@
 package me.chanjar.weixin.mp.bean.marketing;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
@@ -16,7 +16,6 @@
 @Data
 public class WxMpUserActionSet implements Serializable {
   private static final long serialVersionUID = 1979861770645159905L;
-  protected static final JsonParser JSON_PARSER = new JsonParser();
 
   /**
    * user_action_set_id
@@ -48,7 +47,7 @@ public class WxMpUserActionSet implements Serializable {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("data").getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("data").getAsJsonObject().get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
index 83782f66f0..76d4f8bccf 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
@@ -3,9 +3,9 @@
 import java.io.Serializable;
 import java.util.List;
 
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -37,13 +37,13 @@ public class WxUserTag implements Serializable {
 
   public static WxUserTag fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(json).getAsJsonObject().get("tag"),
+      GsonParser.parse(json).get("tag"),
       WxUserTag.class);
   }
 
   public static List listFromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(json).getAsJsonObject().get("tags"),
+      GsonParser.parse(json).get("tags"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
index 2b3d45a7da..4458ec3a8d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
@@ -3,10 +3,10 @@
 import java.io.Serializable;
 import java.util.List;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -19,7 +19,7 @@
  */
 @Data
 public class WxMpTemplate implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -7366474522571199372L;
 
   /**
@@ -60,7 +60,7 @@ public class WxMpTemplate implements Serializable {
   private String example;
 
   public static List fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(JSON_PARSER.parse(json).getAsJsonObject().get("template_list"),
+    return WxMpGsonBuilder.create().fromJson(GsonParser.parse(json).get("template_list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopDataResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopDataResult.java
index 2a3c795022..50aec028d1 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopDataResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopDataResult.java
@@ -1,8 +1,8 @@
 package me.chanjar.weixin.mp.bean.wifi;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.List;
@@ -17,7 +17,7 @@
 public class WxMpWifiShopDataResult {
   public static WxMpWifiShopDataResult fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(json).getAsJsonObject().get("data"),
+      GsonParser.parse(json).get("data"),
       WxMpWifiShopDataResult.class);
   }
 
@@ -86,7 +86,7 @@ public static WxMpWifiShopDataResult fromJson(String json) {
    */
   @SerializedName("finishpage_url")
   private String finishPageUrl;
-  
+
   /**
    * 商户自己的id,与门店poi_id对应关系,建议在添加门店时候建立关联关系,具体请参考“微信门店接口”.
    */
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopListResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopListResult.java
index 4a86acb353..63bd638d40 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopListResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopListResult.java
@@ -1,8 +1,8 @@
 package me.chanjar.weixin.mp.bean.wifi;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.List;
@@ -18,7 +18,7 @@
 public class WxMpWifiShopListResult {
   public static WxMpWifiShopListResult fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(json).getAsJsonObject().get("data"),
+      GsonParser.parse(json).get("data"),
       WxMpWifiShopListResult.class);
   }
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java
index 8ceba29c26..9f22dbed3e 100755
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java
@@ -20,7 +20,6 @@
 import com.google.common.base.CharMatcher;
 import com.google.common.io.BaseEncoding;
 import me.chanjar.weixin.mp.config.WxMpConfigStorage;
-import org.apache.commons.codec.binary.Base64;
 
 public class WxMpCryptUtil extends me.chanjar.weixin.common.util.crypto.WxCryptUtil {
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImplTest.java
index 3d1b74e6c3..dd15496e16 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImplTest.java
@@ -9,8 +9,6 @@
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.*;
-
 /**
  * 测试类.
  *
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
index 89069bd29f..2d27e4dac7 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
@@ -9,7 +9,6 @@
 import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
 import me.chanjar.weixin.mp.bean.result.WxMpUserList;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 import org.testng.Assert;
 import org.testng.annotations.BeforeTest;
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java
index f7860e7c85..573fa2860f 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java
@@ -2,7 +2,6 @@
 
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/menu/WxMpGetSelfMenuInfoResultTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/menu/WxMpGetSelfMenuInfoResultTest.java
index 3df5742704..0b80ed083e 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/menu/WxMpGetSelfMenuInfoResultTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/menu/WxMpGetSelfMenuInfoResultTest.java
@@ -5,7 +5,6 @@
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.*;
 
 /**
  * @author Binary Wang
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 e111b5a18b..5e54929a04 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
@@ -2,7 +2,6 @@
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -10,6 +9,7 @@
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.crypto.SHA1;
 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.WxMpService;
 import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
@@ -33,7 +33,7 @@
 @Slf4j
 @AllArgsConstructor
 public class WxOpenComponentServiceImpl implements WxOpenComponentService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final Map WX_OPEN_MA_SERVICE_MAP = new ConcurrentHashMap<>();
   private static final Map WX_OPEN_MP_SERVICE_MAP = new ConcurrentHashMap<>();
   private static final Map WX_OPEN_FAST_MA_SERVICE_MAP = new ConcurrentHashMap<>();
@@ -435,7 +435,7 @@ public WxMaJscode2SessionResult miniappJscode2Session(String appId, String jsCod
   @Override
   public List getTemplateDraftList() throws WxErrorException {
     String responseContent = get(GET_TEMPLATE_DRAFT_LIST_URL, "access_token");
-    JsonObject response = JSON_PARSER.parse(StringUtils.defaultString(responseContent, "{}")).getAsJsonObject();
+    JsonObject response = GsonParser.parse(StringUtils.defaultString(responseContent, "{}"));
     boolean hasDraftList = response.has("draft_list");
     if (hasDraftList) {
       return WxOpenGsonBuilder.create().fromJson(response.getAsJsonArray("draft_list"),
@@ -449,7 +449,7 @@ public List getTemplateDraftList() throws WxErrorException
   @Override
   public List getTemplateList() throws WxErrorException {
     String responseContent = get(GET_TEMPLATE_LIST_URL, "access_token");
-    JsonObject response = JSON_PARSER.parse(StringUtils.defaultString(responseContent, "{}")).getAsJsonObject();
+    JsonObject response = GsonParser.parse(StringUtils.defaultString(responseContent, "{}"));
     boolean hasTemplateList = response.has("template_list");
     if (hasTemplateList) {
       return WxOpenGsonBuilder.create().fromJson(response.getAsJsonArray("template_list"),
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java
index 6e06a16d4a..274b5c49dd 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java
@@ -1,6 +1,5 @@
 package me.chanjar.weixin.open.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaPreviewInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaPreviewInfo.java
index a1f0416dd2..47f8b37a3e 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaPreviewInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaPreviewInfo.java
@@ -3,8 +3,6 @@
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 
-import java.util.List;
-
 /**
  * @author zxfreedom
  * @description
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
index b7e567182f..cdc05af72e 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
@@ -11,8 +11,6 @@
 import okhttp3.Request;
 import okhttp3.Response;
 import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java
index 5b11878d28..b507e0daa4 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java
@@ -3,7 +3,6 @@
 import com.google.common.base.CharMatcher;
 import com.google.common.io.BaseEncoding;
 import me.chanjar.weixin.open.api.WxOpenConfigStorage;
-import org.apache.commons.codec.binary.Base64;
 
 /**
  * @author 007
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 0e8cba5c3c..47a5069f24 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
@@ -2,8 +2,6 @@
 
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.*;
-
 /**
  * 单元测试类.
  *
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
index 6f89254714..79ca491ecf 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
@@ -8,7 +8,6 @@
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.annotation.Required;
-import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.util.Map;
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
index c8200b4cc9..3bff328b80 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
@@ -2,7 +2,6 @@
 
 import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
 import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.exception.WxPayException;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.*;
 import me.chanjar.weixin.common.annotation.Required;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
index d67edc1ab3..6a2d3b46d6 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
@@ -1,11 +1,11 @@
 package com.github.binarywang.wxpay.bean.result;
 
 import com.google.common.collect.Lists;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
+import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.*;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.w3c.dom.Document;
@@ -149,10 +149,10 @@ public void composePromotionDetails() {
       return;
     }
 
-    JsonElement tmpJsonElement = new JsonParser().parse(this.promotionDetailString);
+    JsonObject tmpJson = GsonParser.parse(this.promotionDetailString);
 
     final List promotionDetail = WxGsonBuilder.create()
-      .fromJson(tmpJsonElement.getAsJsonObject().get("promotion_detail"),
+      .fromJson(tmpJson.get("promotion_detail"),
         new TypeToken>() {
         }.getType()
       );
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
index 8d21f7a0f3..6b4de3d639 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
@@ -1,13 +1,13 @@
 package com.github.binarywang.wxpay.bean.result;
 
 import com.google.common.collect.Lists;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
+import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.w3c.dom.Document;
@@ -138,10 +138,10 @@ public void composePromotionDetails() {
       return;
     }
 
-    JsonElement tmpJsonElement = new JsonParser().parse(this.promotionDetailString);
+    JsonObject tmpJson = GsonParser.parse(this.promotionDetailString);
 
     final List promotionDetail = WxGsonBuilder.create()
-      .fromJson(tmpJsonElement.getAsJsonObject().get("promotion_detail"),
+      .fromJson(tmpJson.get("promotion_detail"),
         new TypeToken>() {
         }.getType()
       );
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/PayScoreService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/PayScoreService.java
index d4d3b245e3..ff6aafe9f4 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/PayScoreService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/PayScoreService.java
@@ -5,8 +5,6 @@
 import com.github.binarywang.wxpay.bean.payscore.WxPayScoreResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
 
-import java.net.URISyntaxException;
-
 /**
  * 
  *  支付分相关服务类.
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java
index c3a2b7219f..3500ad41ef 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java
@@ -1,8 +1,6 @@
 package com.github.binarywang.wxpay.service.impl;
 
 import com.github.binarywang.wxpay.bean.profitsharing.*;
-import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingResult;
-import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingRequest;
 import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.ProfitSharingService;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
index 1b2d08984a..951451a1dd 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
@@ -3,8 +3,8 @@
 import com.github.binarywang.wxpay.bean.WxPayApiData;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import jodd.util.Base64;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpStatus;
@@ -38,7 +38,6 @@
  * @author Binary Wang
  */
 public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
-  private final static JsonParser JSON_PARSER = new JsonParser();
 
   @Override
   public byte[] postForBytes(String url, String requestStr, boolean useKey) throws WxPayException {
@@ -104,7 +103,7 @@ public String postV3(String url, String requestStr) throws WxPayException {
         return responseString;
       } else {
         //有错误提示信息返回
-        JsonObject jsonObject = JSON_PARSER.parse(responseString).getAsJsonObject();
+        JsonObject jsonObject = GsonParser.parse(responseString);
         throw new WxPayException(jsonObject.get("message").getAsString());
       }
     } catch (Exception e) {
@@ -132,7 +131,7 @@ public String getV3(URI url) throws WxPayException {
         return responseString;
       } else {
         //有错误提示信息返回
-        JsonObject jsonObject = JSON_PARSER.parse(responseString).getAsJsonObject();
+        JsonObject jsonObject = GsonParser.parse(responseString);
         throw new WxPayException(jsonObject.get("message").getAsString());
       }
     } catch (Exception e) {
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java
index 2654e8675c..9fca14e644 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java
@@ -10,8 +10,6 @@
 import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
 import org.apache.http.client.methods.HttpUriRequest;
 import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Slf4j
 public class WxPayCredentials implements Credentials {
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayValidator.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayValidator.java
index c83f8853e3..9b9b0ad4de 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayValidator.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayValidator.java
@@ -9,8 +9,7 @@
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 @Slf4j
 public class WxPayValidator implements Validator {
   private Verifier verifier;
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java
index 2a2f030fc7..5cd4dcdc10 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java
@@ -2,8 +2,6 @@
 
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.*;
-
 /**
  * .
  *
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java
index 087ba7fc34..13f94d4015 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java
@@ -1,9 +1,6 @@
 package com.github.binarywang.wxpay.service.impl;
 
 import com.github.binarywang.wxpay.bean.profitsharing.*;
-import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingRequest;
-import com.github.binarywang.wxpay.bean.profitsharing.Receiver;
-import com.github.binarywang.wxpay.bean.profitsharing.ReceiverList;
 import com.github.binarywang.wxpay.constant.WxPayConstants;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;

From 10c4d45f9145fb397f36272b10e88f81dfbbf2e0 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Tue, 7 Jul 2020 10:03:27 +0800
Subject: [PATCH 42/90] =?UTF-8?q?:art:=20#1647=20=E4=BC=98=E5=8C=96?=
 =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8Fredis=E9=85=8D=E7=BD=AE=E6=94=AF?=
 =?UTF-8?q?=E6=8C=81=EF=BC=8C=E5=8E=BB=E6=8E=89=E5=AE=B9=E6=98=93=E5=AF=BC?=
 =?UTF-8?q?=E8=87=B4=E9=97=AE=E9=A2=98=E7=9A=84=E6=9E=84=E9=80=A0=E6=96=B9?=
 =?UTF-8?q?=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wx/miniapp/config/impl/WxMaRedisBetterConfigImpl.java     | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedisBetterConfigImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedisBetterConfigImpl.java
index 3932531a16..d8876f6aef 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedisBetterConfigImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedisBetterConfigImpl.java
@@ -21,10 +21,6 @@ public class WxMaRedisBetterConfigImpl extends WxMaDefaultConfigImpl {
   private volatile String accessTokenKey;
   private volatile String lockKey;
 
-  public WxMaRedisBetterConfigImpl(JedisPool jedisPool) {
-    this(new JedisWxRedisOps(jedisPool), "wa");
-  }
-
   public WxMaRedisBetterConfigImpl(WxRedisOps redisOps, String keyPrefix) {
     this.redisOps = redisOps;
     this.keyPrefix = keyPrefix;

From 1650ee2e205214be28f9bae89bc6be71c95c8f1f Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Tue, 7 Jul 2020 10:04:17 +0800
Subject: [PATCH 43/90] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E5=B0=8F?=
 =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=9B=B4=E6=92=AD=E6=8E=A5=E5=8F=A3=E8=8E=B7?=
 =?UTF-8?q?=E5=8F=96=E4=B8=8D=E5=88=B0=E9=83=A8=E5=88=86=E5=AD=97=E6=AE=B5?=
 =?UTF-8?q?=E5=80=BC=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../miniapp/api/impl/WxMaLiveGoodsServiceImpl.java  |  4 +---
 .../binarywang/wx/miniapp/bean/WxMaLiveResult.java  | 13 +++++++++++--
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
index 8e6a3f2caa..d819ff8054 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
@@ -9,7 +9,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
@@ -30,8 +29,7 @@
  */
 @AllArgsConstructor
 public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
-
-  private WxMaService wxMaService;
+  private final WxMaService wxMaService;
 
   @Override
   public WxMaLiveResult addGoods(WxMaLiveInfo.Goods goods) throws WxErrorException {
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveResult.java
index 2b0407e6aa..2040b4a525 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaLiveResult.java
@@ -49,8 +49,16 @@ public static class Goods implements Serializable {
     private static final long serialVersionUID = 5769245932149287574L;
     @SerializedName("goods_id")
     private Integer goodsId;
+    /**
+     * 获取商品列表返回的商品图片
+     */
     @SerializedName("cover_img_url")
     private String coverImgUrl;
+    /**
+     * 获取直播间列表返回的商品图片
+     */
+    @SerializedName("cover_img")
+    private String coverImg;
     private String name;
     private String url;
     @SerializedName("price_type")
@@ -76,7 +84,8 @@ public static class Goods implements Serializable {
   public static class RoomInfo implements Serializable {
     private static final long serialVersionUID = 7745775280267417154L;
     private String name;
-    private Integer roomid;
+    @SerializedName("roomid")
+    private Integer roomId;
     @SerializedName("cover_img")
     private String coverImg;
     @SerializedName("share_img")
@@ -102,7 +111,7 @@ public static class RoomInfo implements Serializable {
     private Integer closeGoods;
     @SerializedName("close_comment")
     private Integer closeComment;
-    private List goods;
+    private List goods;
   }
 
   /**

From b93169e78ce21ca9cf8bb0881c2b885478eacec2 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Fri, 10 Jul 2020 11:33:22 +0800
Subject: [PATCH 44/90] =?UTF-8?q?:bug:=20#1664=20=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E4=BF=AE=E5=A4=8D=E8=8E=B7=E5=8F=96=E8=81=94?=
 =?UTF-8?q?=E7=B3=BB=E5=AE=A2=E6=88=B7=E7=BB=9F=E8=AE=A1=E6=95=B0=E6=8D=AE?=
 =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84=E9=94=99=E8=AF=AF=E5=AD=97=E6=AE=B5?=
 =?UTF-8?q?=EF=BC=9Anegative=5Ffee=5Fback=5Fcnt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/cp/bean/WxCpUserExternalUserBehaviorStatistic.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUserBehaviorStatistic.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUserBehaviorStatistic.java
index bc1aa0ca53..ced1c62db6 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUserBehaviorStatistic.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUserBehaviorStatistic.java
@@ -56,8 +56,8 @@ public static class Behavior {
     /**
      * 删除/拉黑成员的客户数,即将成员删除或加入黑名单的客户数。
      */
-    @SerializedName("negative_fee_back_cnt")
-    private int negativeFeeBackCnt;
+    @SerializedName("negative_feedback_cnt")
+    private int negativeFeedbackCnt;
 
     /**
      * 发起申请数,成员通过「搜索手机号」、「扫一扫」、「从微信好友中添加」、「从群聊中添加」、「添加共享、分配给我的客户」、「添加单向、双向删除好友关系的好友」、「从新的联系人推荐中添加」等渠道主动向客户发起的好友申请数量。

From 4ab50809d8953e11b3ddbc3e9fb56cc6a30aa4f1 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 11 Jul 2020 21:40:33 +0800
Subject: [PATCH 45/90] =?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

---
 .../weixin/common/util/json/GsonParser.java   | 10 ++--
 .../common/util/json/WxGsonBuilder.java       |  1 -
 weixin-java-pay/pom.xml                       |  1 +
 .../wxpay/bean/payscore/TimeRange.java        |  2 +
 .../bean/payscore/WxPayScoreRequest.java      |  5 ++
 .../wxpay/bean/payscore/WxPayScoreResult.java |  5 ++
 .../service/impl/PayScoreServiceImpl.java     | 39 +++++++-------
 .../auth/AutoUpdateCertificatesVerifier.java  | 43 ++++++++-------
 .../bean/payscore/WxPayScoreRequestTest.java  | 54 +++++++++++++++++++
 .../service/impl/PayScoreServiceImplTest.java |  2 +-
 10 files changed, 116 insertions(+), 46 deletions(-)
 create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreRequestTest.java

diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java
index 494e75a9ee..53f51e0f3e 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java
@@ -3,21 +3,25 @@
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.gson.stream.JsonReader;
+import lombok.NoArgsConstructor;
 
 import java.io.Reader;
 
+/**
+ * @author niefy
+ */
 public class GsonParser {
   private static final JsonParser JSON_PARSER = new JsonParser();
 
-  public static JsonObject parse(String json){
+  public static JsonObject parse(String json) {
     return JSON_PARSER.parse(json).getAsJsonObject();
   }
 
-  public static JsonObject parse(Reader json){
+  public static JsonObject parse(Reader json) {
     return JSON_PARSER.parse(json).getAsJsonObject();
   }
 
-  public static JsonObject parse(JsonReader json){
+  public static JsonObject parse(JsonReader json) {
     return JSON_PARSER.parse(json).getAsJsonObject();
   }
 }
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java
index b52bad9531..0624923508 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java
@@ -13,7 +13,6 @@
  * @author chanjarster
  */
 public class WxGsonBuilder {
-
   private static final GsonBuilder INSTANCE = new GsonBuilder();
 
   static {
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index e199395a10..e413ade740 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -71,6 +71,7 @@
       lombok
     
     
+      
       com.fasterxml.jackson.core
       jackson-databind
       2.9.10.4
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/TimeRange.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/TimeRange.java
index 08b86d6eda..a0a27693d7 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/TimeRange.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/TimeRange.java
@@ -1,6 +1,7 @@
 package com.github.binarywang.wxpay.bean.payscore;
 
 import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -14,6 +15,7 @@
  */
 @Data
 @NoArgsConstructor
+@AllArgsConstructor
 public class TimeRange implements Serializable {
   private static final long serialVersionUID = 8169562173656314930L;
   /**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreRequest.java
index e76801b907..c4fd494382 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreRequest.java
@@ -6,6 +6,7 @@
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 import java.util.List;
@@ -22,6 +23,10 @@
 public class WxPayScoreRequest implements Serializable {
   private static final long serialVersionUID = 364764508076146082L;
 
+  public String toJson() {
+    return WxGsonBuilder.create().toJson(this);
+  }
+
   /**
    * out_order_no : 1234323JKHDFE1243252
    * appid : wxd678efh567hg6787
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreResult.java
index 506148ad96..58665bf55e 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreResult.java
@@ -3,6 +3,7 @@
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 import java.util.List;
@@ -17,6 +18,10 @@
 public class WxPayScoreResult implements Serializable {
   private static final long serialVersionUID = 8809250065540275770L;
 
+  public static WxPayScoreResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxPayScoreResult.class);
+  }
+
   /**
    * appid : wxd678efh567hg6787
    * mchid : 1230000109
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 14950a5b2d..7fa7efa58b 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
@@ -8,9 +8,8 @@
 import com.github.binarywang.wxpay.service.PayScoreService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.v3.util.AesUtils;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
 import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.client.utils.URIBuilder;
 
@@ -26,7 +25,6 @@
  */
 @RequiredArgsConstructor
 public class PayScoreServiceImpl implements PayScoreService {
-  private static final Gson GSON = new GsonBuilder().create();
   private final WxPayService payService;
 
   @Override
@@ -37,8 +35,8 @@ public WxPayScoreResult createServiceOrder(WxPayScoreRequest request) throws WxP
     request.setAppid(config.getAppId());
     request.setServiceId(config.getServiceId());
     request.setNotifyUrl(config.getPayScoreNotifyUrl());
-    String result = payService.postV3(url, GSON.toJson(request));
-    WxPayScoreResult wxPayScoreCreateResult = GSON.fromJson(result, WxPayScoreResult.class);
+    String result = this.payService.postV3(url, request.toJson());
+    WxPayScoreResult wxPayScoreCreateResult = WxPayScoreResult.fromJson(result);
 
     //补充算一下签名给小程序跳转用
     String currentTimeMillis = System.currentTimeMillis() + "";
@@ -84,7 +82,7 @@ public WxPayScoreResult queryServiceOrder(String outOrderNo, String queryId) thr
     uriBuilder.setParameter("appid", config.getAppId());
     try {
       String result = payService.getV3(uriBuilder.build());
-      return GSON.fromJson(result, WxPayScoreResult.class);
+      return WxPayScoreResult.fromJson(result);
     } catch (URISyntaxException e) {
       throw new WxPayException("未知异常!", e);
     }
@@ -95,12 +93,12 @@ public WxPayScoreResult queryServiceOrder(String outOrderNo, String queryId) thr
   public WxPayScoreResult cancelServiceOrder(String outOrderNo, String reason) throws WxPayException {
     WxPayConfig config = this.payService.getConfig();
     String url = String.format("%s/v3/payscore/serviceorder/%s/cancel", this.payService.getPayBaseUrl(), outOrderNo);
-    HashMap map = new HashMap<>(4);
+    Map map = new HashMap<>(4);
     map.put("appid", config.getAppId());
     map.put("service_id", config.getServiceId());
     map.put("reason", reason);
-    String result = payService.postV3(url, GSON.toJson(map));
-    return GSON.fromJson(result, WxPayScoreResult.class);
+    String result = payService.postV3(url, WxGsonBuilder.create().toJson(map));
+    return WxPayScoreResult.fromJson(result);
   }
 
   @Override
@@ -111,8 +109,8 @@ public WxPayScoreResult modifyServiceOrder(WxPayScoreRequest request) throws WxP
     request.setAppid(config.getAppId());
     request.setServiceId(config.getServiceId());
     request.setOutOrderNo(null);
-    String result = payService.postV3(url, GSON.toJson(request));
-    return GSON.fromJson(result, WxPayScoreResult.class);
+    String result = payService.postV3(url, request.toJson());
+    return WxPayScoreResult.fromJson(result);
   }
 
   @Override
@@ -123,19 +121,19 @@ public WxPayScoreResult completeServiceOrder(WxPayScoreRequest request) throws W
     request.setAppid(config.getAppId());
     request.setServiceId(config.getServiceId());
     request.setOutOrderNo(null);
-    String result = payService.postV3(url, GSON.toJson(request));
-    return GSON.fromJson(result, WxPayScoreResult.class);
+    String result = payService.postV3(url, request.toJson());
+    return WxPayScoreResult.fromJson(result);
   }
 
   @Override
   public WxPayScoreResult payServiceOrder(String outOrderNo) throws WxPayException {
     WxPayConfig config = this.payService.getConfig();
     String url = String.format("%s/v3/payscore/serviceorder/%s/pay", this.payService.getPayBaseUrl(), outOrderNo);
-    HashMap map = new HashMap<>(2);
+    Map map = new HashMap<>(2);
     map.put("appid", config.getAppId());
     map.put("service_id", config.getServiceId());
-    String result = payService.postV3(url, GSON.toJson(map));
-    return GSON.fromJson(result, WxPayScoreResult.class);
+    String result = payService.postV3(url, WxGsonBuilder.create().toJson(map));
+    return WxPayScoreResult.fromJson(result);
   }
 
   @Override
@@ -146,13 +144,13 @@ public WxPayScoreResult syncServiceOrder(WxPayScoreRequest request) throws WxPay
     request.setAppid(config.getAppId());
     request.setServiceId(config.getServiceId());
     request.setOutOrderNo(null);
-    String result = payService.postV3(url, GSON.toJson(request));
-    return GSON.fromJson(result, WxPayScoreResult.class);
+    String result = payService.postV3(url, request.toJson());
+    return WxPayScoreResult.fromJson(result);
   }
 
   @Override
   public PayScoreNotifyData parseNotifyData(String data) {
-    return GSON.fromJson(data, PayScoreNotifyData.class);
+    return WxGsonBuilder.create().fromJson(data, PayScoreNotifyData.class);
   }
 
   @Override
@@ -163,8 +161,7 @@ public WxPayScoreResult decryptNotifyDataResource(PayScoreNotifyData data) throw
     String nonce = resource.getNonce();
     String apiV3Key = this.payService.getConfig().getApiV3Key();
     try {
-      String s = AesUtils.decryptToString(associatedData, nonce, cipherText, apiV3Key);
-      return GSON.fromJson(s, WxPayScoreResult.class);
+      return WxPayScoreResult.fromJson(AesUtils.decryptToString(associatedData, nonce, cipherText, apiV3Key));
     } catch (GeneralSecurityException | IOException e) {
       throw new WxPayException("解析报文异常!", e);
     }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifier.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifier.java
index 59ad93cb77..db656f4c94 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifier.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifier.java
@@ -25,6 +25,7 @@
 import java.security.cert.CertificateNotYetValidException;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -148,30 +149,32 @@ public boolean validate(CloseableHttpResponse response) throws IOException {
    * 反序列化证书并解密
    */
   private List deserializeToCerts(byte[] apiV3Key, String body) throws GeneralSecurityException, IOException {
-    AesUtils decryptor = new AesUtils(apiV3Key);
+    AesUtils aesUtils = new AesUtils(apiV3Key);
     ObjectMapper mapper = new ObjectMapper();
     JsonNode dataNode = mapper.readTree(body).get("data");
+    if (dataNode == null) {
+      return Collections.emptyList();
+    }
+
     List newCertList = new ArrayList<>();
-    if (dataNode != null) {
-      for (int i = 0, count = dataNode.size(); i < count; i++) {
-        JsonNode encryptCertificateNode = dataNode.get(i).get("encrypt_certificate");
-        //解密
-        String cert = decryptor.decryptToString(
-          encryptCertificateNode.get("associated_data").toString().replaceAll("\"", "")
-            .getBytes(StandardCharsets.UTF_8),
-          encryptCertificateNode.get("nonce").toString().replaceAll("\"", "")
-            .getBytes(StandardCharsets.UTF_8),
-          encryptCertificateNode.get("ciphertext").toString().replaceAll("\"", ""));
-
-        X509Certificate x509Cert = PemUtils
-          .loadCertificate(new ByteArrayInputStream(cert.getBytes(StandardCharsets.UTF_8)));
-        try {
-          x509Cert.checkValidity();
-        } catch (CertificateExpiredException | CertificateNotYetValidException e) {
-          continue;
-        }
-        newCertList.add(x509Cert);
+    for (int i = 0, count = dataNode.size(); i < count; i++) {
+      JsonNode encryptCertificateNode = dataNode.get(i).get("encrypt_certificate");
+      //解密
+      String cert = aesUtils.decryptToString(
+        encryptCertificateNode.get("associated_data").toString().replaceAll("\"", "")
+          .getBytes(StandardCharsets.UTF_8),
+        encryptCertificateNode.get("nonce").toString().replaceAll("\"", "")
+          .getBytes(StandardCharsets.UTF_8),
+        encryptCertificateNode.get("ciphertext").toString().replaceAll("\"", ""));
+
+      X509Certificate x509Cert = PemUtils
+        .loadCertificate(new ByteArrayInputStream(cert.getBytes(StandardCharsets.UTF_8)));
+      try {
+        x509Cert.checkValidity();
+      } catch (CertificateExpiredException | CertificateNotYetValidException e) {
+        continue;
       }
+      newCertList.add(x509Cert);
     }
 
     return newCertList;
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreRequestTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreRequestTest.java
new file mode 100644
index 0000000000..6976bba38c
--- /dev/null
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/payscore/WxPayScoreRequestTest.java
@@ -0,0 +1,54 @@
+package com.github.binarywang.wxpay.bean.payscore;
+
+import org.testng.annotations.Test;
+
+/**
+ * @author Binary Wang
+ * @date 2020-07-11
+ */
+public class WxPayScoreRequestTest {
+  @Test
+  public void testToJson() {
+    WxPayScoreRequest request = WxPayScoreRequest.builder()
+      .outOrderNo("QLS202005201058000201")
+      .appid("123")
+      .serviceId("345")
+      .serviceIntroduction("租借服务")
+      .timeRange(new TimeRange("OnAccept", "20200520225840"))
+      .build();
+    System.out.println(request.toJson());
+    /*    {
+      "out_order_no":"QLS202005201058000201",
+      "appid":"123",
+      "service_id":"345",
+      "service_introduction":"租借服务",
+      "time_range":{
+      "start_time":"OnAccept",
+        "end_time":"20200520225840"
+    },
+      "location":{
+      "start_location":"山",
+        "end_location":"山"
+    },
+      "risk_fund":{
+      "name":"DEPOSIT",
+        "amount":200,
+        "description":"丢失偿还费用2元/台"
+    },
+      "attach":"",
+      "notify_url":"/pay/notify/payScore",
+      "openid":"",
+      "need_user_confirm":true,
+      "profit_sharing":false,
+      "post_payments":[
+      {
+        "name":"租借服务",
+        "amount":100,
+        "description":"服务费:1元/台",
+        "count":1
+      }
+    ],
+      "total_amount":0
+    }*/
+  }
+}
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/PayScoreServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/PayScoreServiceImplTest.java
index 0aa6cafb2d..425cf99c6c 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/PayScoreServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/PayScoreServiceImplTest.java
@@ -64,7 +64,7 @@ public void testCreateServiceOrder() throws WxPayException {
   }
 
   @Test
-  public void testQueryServiceOrder() throws URISyntaxException, WxPayException {
+  public void testQueryServiceOrder() throws WxPayException {
     //两个参数选填一个
     this.payService.getPayScoreService().queryServiceOrder("11", "");
   }

From 03c143b09ac5ac498bec467442efa371a1003701 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 11 Jul 2020 22:20:48 +0800
Subject: [PATCH 46/90] =?UTF-8?q?:bookmark:=20=20=E5=8F=91=E5=B8=83=203.8.?=
 =?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 +-
 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 +-
 13 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/pom.xml b/pom.xml
index 5c00db5b0f..932f1cd25f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
   4.0.0
   com.github.binarywang
   wx-java
-  3.8.4.B
+  3.8.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 902d1a0e73..a72e0ff2ed 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.4.B
+    3.8.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 e827a68a75..fe81fa9b59 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.4.B
+    3.8.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 96dd35b9c1..c0d3e686b0 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.4.B
+    3.8.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 a39374e777..8d7d719488 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.4.B
+    3.8.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 60b5e6cf76..cec9db07f8 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.4.B
+    3.8.5.B
   
   4.0.0
 
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 976d1483d0..814edabd62 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.4.B
+    3.8.5.B
   
 
   weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index ff95e01c88..55738f1837 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.4.B
+    3.8.5.B
   
 
   weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 14f16edee0..e3f52ffaa8 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.4.B
+    3.8.5.B
   
 
   weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 2497aa3c8e..7a60979956 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.4.B
+    3.8.5.B
   
 
   weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index eb160cb2b0..1b9a237c9a 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.4.B
+    3.8.5.B
   
 
   weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index ed551cb399..b04fab2f55 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.4.B
+    3.8.5.B
   
 
   weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index e413ade740..9b730529a7 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.4.B
+    3.8.5.B
   
   4.0.0
 

From 7c0a38e1a0c17d7a9729cb927859e60e272151c9 Mon Sep 17 00:00:00 2001
From: Dean Wong 
Date: Wed, 15 Jul 2020 09:36:00 +0800
Subject: [PATCH 47/90] =?UTF-8?q?:new:=20#1668=20=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=A2=9E=E5=8A=A0=E5=A4=96=E9=83=A8=E8=81=94?=
 =?UTF-8?q?=E7=B3=BB=E4=BA=BA=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=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    | 27 ++++---
 .../impl/WxCpExternalContactServiceImpl.java  |  7 ++
 .../weixin/cp/bean/WxCpMsgTemplate.java       | 81 +++++++++++++++++++
 .../cp/bean/WxCpMsgTemplateAddResult.java     | 36 +++++++++
 .../weixin/cp/constant/WxCpApiPathConsts.java |  1 +
 5 files changed, 142 insertions(+), 10 deletions(-)
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplate.java
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplateAddResult.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 94de03e555..2b3a17b87d 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
@@ -88,6 +88,7 @@ public interface WxCpExternalContactService {
 
   /**
    * 企业和第三方可通过此接口,获取所有离职成员的客户列表,并可进一步调用离职成员的外部联系人再分配接口将这些客户重新分配给其他企业成员。
+   *
    * @param page
    * @param pageSize
    * @return
@@ -97,22 +98,24 @@ public interface WxCpExternalContactService {
 
   /**
    * 企业可通过此接口,将已离职成员的外部联系人分配给另一个成员接替联系。
+   *
    * @param externalUserid
    * @param handOverUserid
    * @param takeOverUserid
    * @return
    * @throws WxErrorException
    */
-  WxCpBaseResp transferExternalContact(String externalUserid,String handOverUserid,String takeOverUserid)throws WxErrorException;
+  WxCpBaseResp transferExternalContact(String externalUserid, String handOverUserid, String takeOverUserid) throws WxErrorException;
 
-   /** 
-    * 该接口用于获取配置过客户群管理的客户群列表。
-    * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
-    * 暂不支持第三方调用。
-    * 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92119
-    * 
- */ - 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
+   * 
+ */ + WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pageSize, int status, String[] userIds, String[] partyIds) throws WxErrorException; /** *
@@ -135,6 +138,7 @@ public interface WxCpExternalContactService {
    * 第三方应用需拥有“企业客户”权限。
    * 第三方/自建应用调用时传入的userid和partyid要在应用的可见范围内;
    * 
+ * * @param startTime * @param endTime * @param userIds @@ -150,6 +154,7 @@ public interface WxCpExternalContactService { * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。 * 暂不支持第三方调用。 *
+ * * @param startTime * @param orderBy * @param orderAsc @@ -160,5 +165,7 @@ public interface WxCpExternalContactService { * @return * @throws WxErrorException */ - WxCpUserExternalGroupChatStatistic getGroupChatStatistic(Date startTime,Integer orderBy,Integer orderAsc,Integer pageIndex,Integer pageSize, String[] userIds, String[] partyIds) throws WxErrorException; + WxCpUserExternalGroupChatStatistic getGroupChatStatistic(Date startTime, Integer orderBy, Integer orderAsc, Integer pageIndex, Integer pageSize, String[] userIds, String[] partyIds) throws WxErrorException; + + WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate) 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 961b21d522..982c115502 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 @@ -150,4 +150,11 @@ public WxCpUserExternalGroupChatStatistic getGroupChatStatistic(Date startTime, final String result = this.mainService.post(url, json.toString()); return WxCpUserExternalGroupChatStatistic.fromJson(result); } + + @Override + public WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate) throws WxErrorException { + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(ADD_MSG_TEMPLATE); + final String result = this.mainService.post(url, wxCpMsgTemplate.toJson()); + return WxCpMsgTemplateAddResult.fromJson(result); + } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplate.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplate.java new file mode 100644 index 0000000000..a4abb87821 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplate.java @@ -0,0 +1,81 @@ +package me.chanjar.weixin.cp.bean; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 企业群发消息任务 + *

+ * Created by songfan on 2020/7/14. + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WxCpMsgTemplate implements Serializable { + private static final long serialVersionUID = 3172331565173474358L; + + @SerializedName("chat_type") + private String chatType; + + @SerializedName("external_userid") + private List externalUserid; + + private String sender; + + private Text text; + + private Image image; + + private Link link; + + private Miniprogram miniprogram; + + public static WxCpMsgTemplate fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpMsgTemplate.class); + } + + public String toJson() { + return WxCpGsonBuilder.create().toJson(this); + } + + @Data + public class Text { + private String content; + } + + @Data + public class Image { + + @SerializedName("media_id") + private String mediaId; + + @SerializedName("pic_url") + private String picUrl; + } + + @Data + public class Link { + private String title; + @SerializedName("picurl") + private String picUrl; + private String desc; + private String url; + } + + @Data + public class Miniprogram { + private String title; + @SerializedName("pic_media_id") + private String picMediaId; + private String appid; + private String page; + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplateAddResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplateAddResult.java new file mode 100644 index 0000000000..2e91ec0671 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplateAddResult.java @@ -0,0 +1,36 @@ +package me.chanjar.weixin.cp.bean; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by songfan on 2020/7/14. + */ +@Data +public class WxCpMsgTemplateAddResult implements Serializable { + private static final long serialVersionUID = -5166048319463473188L; + + @SerializedName("errcode") + private Integer errCode; + + @SerializedName("errmsg") + private String errMsg; + + @SerializedName("fail_list") + private List failList; + + @SerializedName("msgid") + private String msgId; + + public static WxCpMsgTemplateAddResult fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpMsgTemplateAddResult.class); + } + + public String toJson() { + return WxCpGsonBuilder.create().toJson(this); + } +} 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 9b465fd0c5..24debae397 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 @@ -126,5 +126,6 @@ public static class ExternalContact { public static final String GROUP_CHAT_INFO = "/cgi-bin/externalcontact/groupchat/get"; public static final String LIST_USER_BEHAVIOR_DATA = "/cgi-bin/externalcontact/get_user_behavior_data"; public static final String LIST_GROUP_CHAT_DATA = "/cgi-bin/externalcontact/groupchat/statistic"; + public static final String ADD_MSG_TEMPLATE = "/cgi-bin/externalcontact/add_msg_template"; } } From 56a271c11cfb650cd4f20762febb247dcf8a889e Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 16 Jul 2020 17:33:36 +0800 Subject: [PATCH 48/90] =?UTF-8?q?:art:=20#1671=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E5=9B=9E=E8=B0=83=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E9=AA=8C=E8=AF=81=E7=AD=BE=E5=90=8D=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/enums/WxMpApiUrl.java | 72 +++++++++---------- .../service/impl/BaseWxPayServiceImpl.java | 12 +++- 2 files changed, 45 insertions(+), 39 deletions(-) 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 7f3b45d249..7e10867658 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 @@ -62,8 +62,8 @@ enum Device implements WxMpApiUrl { */ DEVICE_TRANSMSG(API_DEFAULT_HOST_URL, "/device/transmsg"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -131,8 +131,8 @@ enum Other implements WxMpApiUrl { */ CLEAR_QUOTA_URL(API_DEFAULT_HOST_URL, "/cgi-bin/clear_quota"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -159,8 +159,8 @@ enum Marketing implements WxMpApiUrl { */ WECHAT_AD_LEADS_GET(API_DEFAULT_HOST_URL, "/marketing/wechat_ad_leads/get"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -308,8 +308,8 @@ enum TemplateMsg implements WxMpApiUrl { */ TEMPLATE_DEL_PRIVATE_TEMPLATE(API_DEFAULT_HOST_URL, "/cgi-bin/template/del_private_template"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -332,8 +332,8 @@ enum UserBlacklist implements WxMpApiUrl { */ BATCHUNBLACKLIST(API_DEFAULT_HOST_URL, "/cgi-bin/tags/members/batchunblacklist"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -402,8 +402,8 @@ enum Wifi implements WxMpApiUrl { */ BIZWIFI_SHOP_UPDATE(API_DEFAULT_HOST_URL, "/bizwifi/shop/update"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -493,8 +493,8 @@ enum Ocr implements WxMpApiUrl { */ FILE_COMM(API_DEFAULT_HOST_URL, "/cv/ocr/comm"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -603,8 +603,8 @@ enum Card implements WxMpApiUrl { CARD_USER_CARD_LIST(API_DEFAULT_HOST_URL, "/card/user/getcardlist"), ; - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -683,8 +683,8 @@ enum DataCube implements WxMpApiUrl { */ GET_INTERFACE_SUMMARY_HOUR(API_DEFAULT_HOST_URL, "/datacube/getinterfacesummaryhour"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -755,8 +755,8 @@ enum Kefu implements WxMpApiUrl { */ CUSTOM_TYPING(API_DEFAULT_HOST_URL, "/cgi-bin/message/custom/typing"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -809,8 +809,8 @@ enum MassMessage implements WxMpApiUrl { */ MESSAGE_MASS_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/get"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -865,8 +865,8 @@ enum Material implements WxMpApiUrl { */ MATERIAL_BATCHGET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/material/batchget_material"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -910,8 +910,8 @@ enum MemberCard implements WxMpApiUrl { */ MEMBER_CARD_ACTIVATE_TEMP_INFO(API_DEFAULT_HOST_URL, "/card/membercard/activatetempinfo/get"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -946,8 +946,8 @@ enum Store implements WxMpApiUrl { */ POI_ADD_URL(API_DEFAULT_HOST_URL, "/cgi-bin/poi/addpoi"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -978,8 +978,8 @@ enum User implements WxMpApiUrl { */ USER_CHANGE_OPENID_URL(API_DEFAULT_HOST_URL, "/cgi-bin/changeopenid"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -1029,8 +1029,8 @@ enum Comment implements WxMpApiUrl { */ REPLY_DELETE(API_DEFAULT_HOST_URL, "/cgi-bin/comment/reply/delete"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -1070,8 +1070,8 @@ enum ImgProc implements WxMpApiUrl { */ FILE_AI_CROP(API_DEFAULT_HOST_URL, "/cv/img/aicrop?ratios=%s"); - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { @@ -1145,8 +1145,8 @@ enum Invoice implements WxMpApiUrl { */ GET_PAY_MCH_SET_BIZ_ATTR(API_DEFAULT_HOST_URL, "/card/invoice/setbizattr?action=get_pay_mch"), ; - private String prefix; - private String path; + private final String prefix; + private final String path; @Override public String getUrl(WxMpConfigStorage config) { 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 909b78f257..efe9e70e0a 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 @@ -190,10 +190,16 @@ public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData, String sign try { log.debug("微信支付异步通知请求参数:{}", xmlData); WxPayOrderNotifyResult result = WxPayOrderNotifyResult.fromXML(xmlData); - if (result.getSignType() != null) { - // 如果解析的通知对象中signType有值,则使用它进行验签 - signType = result.getSignType(); + if (signType == null) { + if (result.getSignType() != null) { + // 如果解析的通知对象中signType有值,则使用它进行验签 + signType = result.getSignType(); + } else if (this.getConfig().getSignType() != null) { + // 如果配置中signType有值,则使用它进行验签 + signType = this.getConfig().getSignType(); + } } + log.debug("微信支付异步通知请求解析后的对象:{}", result); result.checkResult(this, signType, false); return result; From 3b8c66a7e155ce5bbb7a6a19f433101081e9872b Mon Sep 17 00:00:00 2001 From: ArBing Date: Fri, 17 Jul 2020 09:27:19 +0800 Subject: [PATCH 49/90] =?UTF-8?q?:art:=20=E8=A7=84=E8=8C=83lock.lock()?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E7=BB=9F=E4=B8=80=E6=94=BE=E5=9C=A8?= =?UTF-8?q?try=E4=BB=A3=E7=A0=81=E5=9D=97=E4=B9=8B=E5=A4=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 谢炳庭 --- .../binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java | 4 ++-- .../me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java | 2 +- .../me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java index a5c8376bc3..9177910e36 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java @@ -33,8 +33,8 @@ public String getCardApiTicket() throws WxErrorException { @Override public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { Lock lock = this.wxMaService.getWxMaConfig().getCardApiTicketLock(); + lock.lock(); try { - lock.lock(); if (forceRefresh) { this.wxMaService.getWxMaConfig().expireCardApiTicket(); } @@ -60,8 +60,8 @@ public String getJsapiTicket() throws WxErrorException { @Override public String getJsapiTicket(boolean forceRefresh) throws WxErrorException { Lock lock = this.wxMaService.getWxMaConfig().getJsapiTicketLock(); + lock.lock(); try { - lock.lock(); if (forceRefresh) { this.wxMaService.getWxMaConfig().expireJsapiTicket(); } 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 7cd4e402e6..43fd2fd2b6 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 @@ -101,8 +101,8 @@ public String getTicket(TicketType type) throws WxErrorException { @Override public String getTicket(TicketType type, boolean forceRefresh) throws WxErrorException { Lock lock = this.getWxMpConfigStorage().getTicketLock(type); + lock.lock(); try { - lock.lock(); if (forceRefresh) { this.getWxMpConfigStorage().expireTicket(type); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java index 1e179c70f5..36f49acd35 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java @@ -49,8 +49,8 @@ public String getCardApiTicket() throws WxErrorException { public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { final TicketType type = TicketType.WX_CARD; Lock lock = getWxMpService().getWxMpConfigStorage().getTicketLock(type); + lock.lock(); try { - lock.lock(); if (forceRefresh) { this.getWxMpService().getWxMpConfigStorage().expireTicket(type); From f6f4b89fc05eae512de1701272d03cb550e1f89d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 18 Jul 2020 22:51:26 +0800 Subject: [PATCH 50/90] =?UTF-8?q?:new:=20#1641=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=A2=9E=E5=8A=A0OA=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E7=94=B3=E8=AF=B7=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/common/error/WxCpErrorMsgEnum.java | 16 +++ .../chanjar/weixin/cp/api/WxCpOaService.java | 37 ++++-- .../weixin/cp/api/impl/WxCpOaServiceImpl.java | 21 ++-- .../weixin/cp/bean/oa/SummaryInfo.java | 41 +++++++ ...lApplyer.java => WxCpApprovalApplier.java} | 2 +- .../cp/bean/oa/WxCpApprovalApplyData.java | 4 +- .../weixin/cp/bean/oa/WxCpApprovalDetail.java | 2 +- .../cp/bean/oa/WxCpOaApplyEventRequest.java | 105 ++++++++++++++++++ .../bean/oa/applydata/ApplyDataContent.java | 35 ++++++ .../weixin/cp/bean/oa/applydata/Content.java | 24 ---- .../cp/bean/oa/applydata/ContentValue.java | 5 +- .../cp/api/impl/WxCpOaServiceImplTest.java | 18 ++- .../bean/oa/WxCpOaApplyEventRequestTest.java | 92 +++++++++++++++ 13 files changed, 352 insertions(+), 50 deletions(-) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/SummaryInfo.java rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/{WxCpApprovalApplyer.java => WxCpApprovalApplier.java} (85%) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpOaApplyEventRequest.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/ApplyDataContent.java delete mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/Content.java create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/oa/WxCpOaApplyEventRequestTest.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java index 4c3dbb7cf1..c742959bb6 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java @@ -1069,10 +1069,26 @@ public enum WxCpErrorMsgEnum { * 获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天. */ CODE_301024(301024, "获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天"), + /** + * 提交审批单请求参数错误 + */ + CODE_301025(301025,"提交审批单请求参数错误"), /** * 不允许更新该用户的userid. */ CODE_301036(301036, "不允许更新该用户的userid"), + /** + * 无审批应用权限,或者提单者不在审批应用/自建应用的可见范围 + */ + CODE_301055(301055,"无审批应用权限,或者提单者不在审批应用/自建应用的可见范围"), + /** + * 审批应用已停用 + */ + CODE_301056(301056,"审批应用已停用"), + /** + * 通用错误码,提交审批单内部接口失败 + */ + CODE_301057(301057,"通用错误码,提交审批单内部接口失败"), /** * 批量导入任务的文件中userid有重复. */ 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 9af5a36e4b..cd8417fcd5 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 @@ -15,6 +15,22 @@ */ public interface WxCpOaService { + /** + *

提交审批申请
+   * 调试工具
+   * 企业可通过审批应用或自建应用Secret调用本接口,代应用可见范围内员工在企业微信“审批应用”内提交指定类型的审批申请。
+   *
+   * 请求方式:POST(HTTPS)
+   * 请求地址: https://qyapi.weixin.qq.com/cgi-bin/oa/applyevent?access_token=ACCESS_TOKEN
+   * 文档地址:https://work.weixin.qq.com/api/doc/90000/90135/91853
+   * 
+ * + * @param request 请求 + * @return 表单提交成功后,返回的表单编号 + * @throws WxErrorException . + */ + String apply(WxCpOaApplyEventRequest request) throws WxErrorException; + /** *
    *  获取打卡数据
@@ -40,7 +56,7 @@ List getCheckinData(Integer openCheckinDataType, Date startTime
    * @param datetime   需要获取规则的当天日期
    * @param userIdList 需要获取打卡规则的用户列表
    * @return 打卡规则列表
-   * @throws WxErrorException
+   * @throws WxErrorException .
    */
   List getCheckinOption(Date datetime, List userIdList) throws WxErrorException;
 
@@ -63,7 +79,7 @@ List getCheckinData(Integer openCheckinDataType, Date startTime
    * @param size      一次请求拉取审批单数量,默认值为100,上限值为100
    * @param filters   筛选条件,可对批量拉取的审批申请设置约束条件,支持设置多个条件,nullable
    * @return WxCpApprovalInfo
-   * @throws WxErrorException
+   * @throws WxErrorException .
    */
   WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime, Integer cursor, Integer size,
                                    List filters) throws WxErrorException;
@@ -74,7 +90,7 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
    * @param startTime 开始时间
    * @param endTime   结束时间
    * @return WxCpApprovalInfo
-   * @throws WxErrorException
+   * @throws WxErrorException .
    * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo
    */
   WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime) throws WxErrorException;
@@ -90,7 +106,7 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
    *
    * @param spNo 审批单编号。
    * @return WxCpApprovaldetail
-   * @throws WxErrorException
+   * @throws WxErrorException .
    */
   WxCpApprovalDetailResult getApprovalDetail(@NonNull String spNo) throws WxErrorException;
 
@@ -104,7 +120,7 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
    * @param startTime 获取审批记录的开始时间
    * @param endTime   获取审批记录的结束时间
    * @param nextSpnum 第一个拉取的审批单号,不填从该时间段的第一个审批单拉取
-   * @throws WxErrorException
+   * @throws WxErrorException .
    * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo
    * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalDetail
    */
@@ -118,18 +134,19 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
    * @param endTime   查询的结束时间戳
    * @param offset    分页查询的偏移量
    * @param limit     分页查询的每页大小,默认为100条,如该参数大于100则按100处理
-   * @return
-   * @throws WxErrorException
+   * @return .
+   * @throws WxErrorException .
    */
   List getDialRecord(Date startTime, Date endTime, Integer offset,
                                      Integer limit) throws WxErrorException;
 
   /**
    * 获取审批模板详情
+   *
    * @param templateId 模板ID
-   * @return
-   * @throws WxErrorException
+   * @return .
+   * @throws WxErrorException .
    */
-  WxCpTemplateResult getTemplateDetail(@NonNull String templateId)throws WxErrorException;
+  WxCpTemplateResult getTemplateDetail(@NonNull String templateId) 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 c626f6f562..bdb1e026cf 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
@@ -31,6 +31,13 @@ public class WxCpOaServiceImpl implements WxCpOaService {
   private static final int MONTH_SECONDS = 30 * 24 * 60 * 60;
   private static final int USER_IDS_LIMIT = 100;
 
+  @Override
+  public String apply(WxCpOaApplyEventRequest request) throws WxErrorException {
+    String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(APPLY_EVENT),
+      request.toJson());
+    return GsonParser.parse(responseContent).get("sp_no").getAsString();
+  }
+
   @Override
   public List getCheckinData(Integer openCheckinDataType, Date startTime, Date endTime,
                                               List userIdList) throws WxErrorException {
@@ -42,10 +49,10 @@ public List getCheckinData(Integer openCheckinDataType, Date st
       throw new RuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
     }
 
-    long endtimestamp = endTime.getTime() / 1000L;
-    long starttimestamp = startTime.getTime() / 1000L;
+    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) {
       throw new RuntimeException("获取记录时间跨度不超过一个月");
     }
 
@@ -53,8 +60,8 @@ public List getCheckinData(Integer openCheckinDataType, Date st
     JsonArray jsonArray = new JsonArray();
 
     jsonObject.addProperty("opencheckindatatype", openCheckinDataType);
-    jsonObject.addProperty("starttime", starttimestamp);
-    jsonObject.addProperty("endtime", endtimestamp);
+    jsonObject.addProperty("starttime", startTimestamp);
+    jsonObject.addProperty("endtime", endTimestamp);
 
     for (String userid : userIdList) {
       jsonArray.add(userid);
@@ -213,9 +220,9 @@ public List getDialRecord(Date startTime, Date endTime, Integer
   @Override
   public WxCpTemplateResult getTemplateDetail(@NonNull String templateId) throws WxErrorException {
     JsonObject jsonObject = new JsonObject();
-    jsonObject.addProperty("template_id",templateId);
+    jsonObject.addProperty("template_id", templateId);
     final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_TEMPLATE_DETAIL);
     String responseContent = this.mainService.post(url, jsonObject.toString());
-    return WxCpGsonBuilder.create().fromJson(responseContent,WxCpTemplateResult.class);
+    return WxCpGsonBuilder.create().fromJson(responseContent, WxCpTemplateResult.class);
   }
 }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/SummaryInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/SummaryInfo.java
new file mode 100644
index 0000000000..49222cd0a5
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/SummaryInfo.java
@@ -0,0 +1,41 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.cp.bean.oa.WxCpOaApplyEventRequest;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 摘要行信息,用于定义某一行摘要显示的内容.
+ *
+ * @author Binary Wang
+ * @date 2020-07-19
+ */
+@Data
+@Accessors(chain = true)
+public class SummaryInfo implements Serializable {
+  private static final long serialVersionUID = 8262265774851382414L;
+  /**
+   * 摘要行信息,用于定义某一行摘要显示的内容
+   */
+  @SerializedName("summary_info")
+  private List summaryInfoData;
+
+  @Data
+  @Accessors(chain = true)
+  public static class SummaryInfoData implements Serializable {
+    private static final long serialVersionUID = 5314161929610113856L;
+    /**
+     * 摘要行显示文字,用于记录列表和消息通知的显示,不要超过20个字符
+     */
+    private String text;
+
+    /**
+     * 摘要行显示语言
+     */
+    private String lang;
+  }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyer.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplier.java
similarity index 85%
rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyer.java
rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplier.java
index f648a6a915..b9b1af3c3a 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyer.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplier.java
@@ -10,7 +10,7 @@
  * @author element
  */
 @Data
-public class WxCpApprovalApplyer extends WxCpOperator implements Serializable {
+public class WxCpApprovalApplier extends WxCpOperator implements Serializable {
 
   private static final long serialVersionUID = -8974662568286821271L;
 
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyData.java
index 26b37aea9c..75427b02ed 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyData.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalApplyData.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.cp.bean.oa;
 
 import lombok.Data;
-import me.chanjar.weixin.cp.bean.oa.applydata.Content;
+import me.chanjar.weixin.cp.bean.oa.applydata.ApplyDataContent;
 
 import java.io.Serializable;
 import java.util.List;
@@ -16,6 +16,6 @@ public class WxCpApprovalApplyData implements Serializable {
 
   private static final long serialVersionUID = 4061352949894274704L;
 
-  private List contents;
+  private List contents;
 
 }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetail.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetail.java
index a22a435844..cba31fc27c 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetail.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetail.java
@@ -49,7 +49,7 @@ public class WxCpApprovalDetail implements Serializable {
    * 申请人信息
    */
   @SerializedName("applyer")
-  private WxCpApprovalApplyer applier;
+  private WxCpApprovalApplier applier;
 
   /**
    * 审批流程信息,可能有多个审批节点
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpOaApplyEventRequest.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpOaApplyEventRequest.java
new file mode 100644
index 0000000000..81dd6b45b0
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpOaApplyEventRequest.java
@@ -0,0 +1,105 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.cp.bean.oa.applydata.ApplyDataContent;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 提交审批申请 请求对象类.
+ *
+ * @author Binary Wang
+ * @date 2020-07-18
+ */
+@Data
+@Accessors(chain = true)
+public class WxCpOaApplyEventRequest implements Serializable {
+  private static final long serialVersionUID = 3362660678938569341L;
+
+  /**
+   * 申请人userid,此审批申请将以此员工身份提交,申请人需在应用可见范围内
+   */
+  @SerializedName("creator_userid")
+  private String creatorUserId;
+
+  /**
+   * 模板id。可在“获取审批申请详情”、“审批状态变化回调通知”中获得,也可在审批模板的模板编辑页面链接中获得。暂不支持通过接口提交[打卡补卡][调班]模板审批单。
+   */
+  @SerializedName("template_id")
+  private String templateId;
+
+  /**
+   * 审批人模式:0-通过接口指定审批人、抄送人(此时approver、notifyer等参数可用); 1-使用此模板在管理后台设置的审批流程,支持条件审批。默认为0
+   */
+  @SerializedName("use_template_approver")
+  private Integer useTemplateApprover;
+
+  /**
+   * 审批流程信息,用于指定审批申请的审批流程,支持单人审批、多人会签、多人或签,可能有多个审批节点,仅use_template_approver为0时生效。
+   */
+  @SerializedName("approver")
+  private List approvers;
+
+  /**
+   * 抄送人节点userid列表,仅use_template_approver为0时生效。
+   */
+  @SerializedName("notifyer")
+  private String[] notifiers;
+
+  /**
+   * 抄送方式:1-提单时抄送(默认值); 2-单据通过后抄送;3-提单和单据通过后抄送。仅use_template_approver为0时生效。
+   */
+  @SerializedName("notify_type")
+  private Integer notifyType;
+
+  /**
+   * 审批申请数据,可定义审批申请中各个控件的值,其中必填项必须有值,选填项可为空,数据结构同“获取审批申请详情”接口返回值中同名参数“apply_data”
+   */
+  @SerializedName("apply_data")
+  private ApplyData applyData;
+
+  /**
+   * 摘要信息,用于显示在审批通知卡片、审批列表的摘要信息,最多3行
+   */
+  @SerializedName("summary_list")
+  private List summaryList;
+
+  public String toJson() {
+    return WxCpGsonBuilder.create().toJson(this);
+  }
+
+  @Data
+  @Accessors(chain = true)
+  public static class Approver implements Serializable {
+    private static final long serialVersionUID = 7625206971546930988L;
+
+    /**
+     * 节点审批方式:1-或签;2-会签,仅在节点为多人审批时有效
+     */
+    private Integer attr;
+
+    /**
+     * 审批节点审批人userid列表,若为多人会签、多人或签,需填写每个人的userid
+     */
+    @SerializedName("userid")
+    private String[] userIds;
+  }
+
+  @Data
+  @Accessors(chain = true)
+  public static class ApplyData implements Serializable {
+    private static final long serialVersionUID = -2462732405265306981L;
+
+    /**
+     * 审批申请数据,可定义审批申请中各个控件的值,其中必填项必须有值,选填项可为空,
+     * 数据结构同“获取审批申请详情”接口返回值中同名参数“apply_data”
+     */
+    @SerializedName("contents")
+    private List contents;
+  }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/ApplyDataContent.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/ApplyDataContent.java
new file mode 100644
index 0000000000..f86ab966e3
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/ApplyDataContent.java
@@ -0,0 +1,35 @@
+package me.chanjar.weixin.cp.bean.oa.applydata;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author element
+ */
+@Data
+@Accessors(chain = true)
+public class ApplyDataContent implements Serializable {
+  private static final long serialVersionUID = 8456821731930526935L;
+  /**
+   * 控件类型:Text-文本;Textarea-多行文本;Number-数字;Money-金额;Date-日期/日期+时间;
+   * Selector-单选/多选;;Contact-成员/部门;Tips-说明文字;File-附件;Table-明细;
+   */
+  private String control;
+
+  /**
+   * 控件id:控件的唯一id,可通过“获取审批模板详情”接口获取
+   */
+  private String id;
+
+  @SerializedName("title")
+  private List titles;
+
+  /**
+   * 控件值 ,需在此为申请人在各个控件中填写内容不同控件有不同的赋值参数,具体说明详见附录。模板配置的控件属性为必填时,对应value值需要有值。
+   */
+  private ContentValue value;
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/Content.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/Content.java
deleted file mode 100644
index c4eb4ada0f..0000000000
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/Content.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package me.chanjar.weixin.cp.bean.oa.applydata;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author element
- */
-@Data
-public class Content implements Serializable {
-  private static final long serialVersionUID = 8456821731930526935L;
-
-  private String control;
-
-  private String id;
-
-  @SerializedName("title")
-  private List titles;
-
-  private ContentValue value;
-}
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 92b47f56da..54e19a4bf9 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
@@ -2,6 +2,7 @@
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.util.List;
@@ -10,6 +11,7 @@
  * @author element
  */
 @Data
+@Accessors(chain = true)
 public class ContentValue implements Serializable {
   private static final long serialVersionUID = -5607678965965065261L;
 
@@ -90,7 +92,7 @@ public static class File implements Serializable {
   @Data
   public static class Child implements Serializable {
     private static final long serialVersionUID = -3500102073821161558L;
-    private List list;
+    private List list;
   }
 
 
@@ -115,5 +117,4 @@ public static class DataRange implements Serializable {
   }
 
 
-
 }
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 4515239084..6f3a76b0ab 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
@@ -81,12 +81,24 @@ public void testGetApprovalDetail() throws WxErrorException {
   }
 
   @Test
-  public void testGetTemplateDetail() throws WxErrorException{
-    String templateId="3TkZjxugodbqpEMk9j7X6h6zKqYkc7MxQrrFmT7H";
-    WxCpTemplateResult result=wxService.getOAService().getTemplateDetail(templateId);
+  public void testGetTemplateDetail() throws WxErrorException {
+    String templateId = "3TkZjxugodbqpEMk9j7X6h6zKqYkc7MxQrrFmT7H";
+    WxCpTemplateResult result = wxService.getOAService().getTemplateDetail(templateId);
     assertThat(result).isNotNull();
     System.out.println("result ");
     System.out.println(gson.toJson(result));
   }
 
+  @Test
+  public void testApply() throws WxErrorException {
+    this.wxService.getOAService().apply(new WxCpOaApplyEventRequest().setCreatorUserId("123"));
+  }
+
+  @Test
+  public void testGetApprovalData() {
+  }
+
+  @Test
+  public void testGetDialRecord() {
+  }
 }
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/oa/WxCpOaApplyEventRequestTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/oa/WxCpOaApplyEventRequestTest.java
new file mode 100644
index 0000000000..b5022115b8
--- /dev/null
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/oa/WxCpOaApplyEventRequestTest.java
@@ -0,0 +1,92 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import me.chanjar.weixin.common.util.json.GsonParser;
+import me.chanjar.weixin.cp.bean.oa.applydata.ApplyDataContent;
+import me.chanjar.weixin.cp.bean.oa.applydata.ContentValue;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * 测试.
+ *
+ * @author Binary Wang
+ * @date 2020-07-18
+ */
+public class WxCpOaApplyEventRequestTest {
+  @Test
+  public void testToJson() {
+    String json = "{\n" +
+      "    \"creator_userid\": \"WangXiaoMing\",\n" +
+      "    \"template_id\": \"3Tka1eD6v6JfzhDMqPd3aMkFdxqtJMc2ZRioeFXkaaa\",\n" +
+      "    \"use_template_approver\":0,\n" +
+      "    \"approver\": [\n" +
+      "        {\n" +
+      "            \"attr\": 2,\n" +
+      "            \"userid\": [\"WuJunJie\",\"WangXiaoMing\"]\n" +
+      "        },\n" +
+      "        {\n" +
+      "            \"attr\": 1,\n" +
+      "            \"userid\": [\"LiuXiaoGang\"]\n" +
+      "        }\n" +
+      "    ],\n" +
+      "    \"notifyer\":[ \"WuJunJie\",\"WangXiaoMing\" ],\n" +
+      "    \"notify_type\" : 1,\n" +
+      "    \"apply_data\": {\n" +
+      "         \"contents\": [\n" +
+      "                {\n" +
+      "                    \"control\": \"Text\",\n" +
+      "                    \"id\": \"Text-15111111111\",\n" +
+      "                    \"value\": {\n" +
+      "                        \"text\": \"文本填写的内容\"\n" +
+      "                    }\n" +
+      "                }\n" +
+      "            ]\n" +
+      "    },\n" +
+      "    \"summary_list\": [\n" +
+      "        {\n" +
+      "            \"summary_info\": [{\n" +
+      "                \"text\": \"摘要第1行\",\n" +
+      "                \"lang\": \"zh_CN\"\n" +
+      "            }]\n" +
+      "        },\n" +
+      "        {\n" +
+      "            \"summary_info\": [{\n" +
+      "                \"text\": \"摘要第2行\",\n" +
+      "                \"lang\": \"zh_CN\"\n" +
+      "            }]\n" +
+      "        },\n" +
+      "        {\n" +
+      "            \"summary_info\": [{\n" +
+      "                \"text\": \"摘要第3行\",\n" +
+      "                \"lang\": \"zh_CN\"\n" +
+      "            }]\n" +
+      "        }\n" +
+      "    ]\n" +
+      "}";
+
+    WxCpOaApplyEventRequest request = new WxCpOaApplyEventRequest();
+    request.setCreatorUserId("WangXiaoMing")
+      .setTemplateId("3Tka1eD6v6JfzhDMqPd3aMkFdxqtJMc2ZRioeFXkaaa")
+      .setUseTemplateApprover(0)
+      .setApprovers(Arrays.asList(new WxCpOaApplyEventRequest.Approver().setAttr(2).setUserIds(new String[]{"WuJunJie", "WangXiaoMing"}),
+        new WxCpOaApplyEventRequest.Approver().setAttr(1).setUserIds(new String[]{"LiuXiaoGang"})))
+      .setNotifiers(new String[]{"WuJunJie", "WangXiaoMing"})
+      .setNotifyType(1)
+      .setApplyData(new WxCpOaApplyEventRequest.ApplyData()
+        .setContents(Collections.singletonList(new ApplyDataContent()
+          .setControl("Text").setId("Text-15111111111").setValue(new ContentValue().setText("文本填写的内容")))))
+      .setSummaryList(Arrays.asList(new SummaryInfo()
+          .setSummaryInfoData(Collections.singletonList(new SummaryInfo.SummaryInfoData().setLang("zh_CN").setText("摘要第1行"))),
+        new SummaryInfo()
+          .setSummaryInfoData(Collections.singletonList(new SummaryInfo.SummaryInfoData().setLang("zh_CN").setText("摘要第2行"))),
+        new SummaryInfo()
+          .setSummaryInfoData(Collections.singletonList(new SummaryInfo.SummaryInfoData().setLang("zh_CN").setText("摘要第3行")))))
+    ;
+
+    assertThat(request.toJson()).isEqualTo(GsonParser.parse(json).toString());
+  }
+}

From 11974f00da16dbb061b1acd733d86cee66eba21f Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 19 Jul 2020 01:06:05 +0800
Subject: [PATCH 51/90] =?UTF-8?q?:art:=20=E4=BC=9A=E5=91=98=E5=8D=A1?=
 =?UTF-8?q?=E7=9B=B8=E5=85=B3bean=E7=B1=BB=E9=87=8D=E6=9E=84=EF=BC=8C?=
 =?UTF-8?q?=E9=9B=86=E4=B8=AD=E5=88=B0=E5=90=8C=E4=B8=80=E5=8C=85=E4=B8=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../chanjar/weixin/mp/api/WxMpMemberCardService.java |  8 ++++----
 .../mp/api/impl/WxMpMemberCardServiceImpl.java       | 12 ++++++------
 .../{ => card}/membercard/ActivatePluginParam.java   |  2 +-
 .../membercard/ActivatePluginParamResult.java        |  2 +-
 .../mp/bean/card/{ => membercard}/MemberCard.java    |  3 ++-
 .../MemberCardActivateUserFormRequest.java           |  8 +++++---
 .../MemberCardActivateUserFormResult.java            |  2 +-
 .../{ => membercard}/MemberCardCreateRequest.java    |  2 +-
 .../bean/card/{ => membercard}/MemberCardUpdate.java |  6 +++++-
 .../{ => membercard}/MemberCardUpdateRequest.java    |  2 +-
 .../card/{ => membercard}/MemberCardUserForm.java    |  2 +-
 .../MemberCardUserFormRichField.java                 |  4 ++--
 .../{ => card}/membercard/MemberCardUserInfo.java    |  2 +-
 .../mp/bean/{ => card}/membercard/NameValues.java    |  2 +-
 .../bean/{ => card}/membercard/NotifyOptional.java   |  2 +-
 .../WxMpMemberCardActivateTempInfoResult.java        |  2 +-
 .../membercard/WxMpMemberCardActivatedMessage.java   |  2 +-
 .../membercard/WxMpMemberCardCreateMessage.java      |  3 +--
 .../membercard/WxMpMemberCardUpdateMessage.java      |  2 +-
 .../membercard/WxMpMemberCardUpdateResult.java       |  2 +-
 .../membercard/WxMpMemberCardUserInfoResult.java     |  2 +-
 .../chanjar/weixin/mp/util/json/WxMpGsonBuilder.java |  6 +++---
 ...pMemberCardActivateTempInfoResultGsonAdapter.java |  6 +++---
 .../json/WxMpMemberCardUpdateResultGsonAdapter.java  |  2 +-
 .../WxMpMemberCardUserInfoResultGsonAdapter.java     |  6 +++---
 .../mp/api/impl/WxMpMemberCardServiceImplTest.java   |  2 +-
 .../membercard/WxMpMemberCardUpdateResultTest.java   |  2 +-
 .../membercard/WxMpMemberCardUserInfoResultTest.java |  2 +-
 28 files changed, 52 insertions(+), 46 deletions(-)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/ActivatePluginParam.java (85%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/ActivatePluginParamResult.java (78%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{ => membercard}/MemberCard.java (98%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{ => membercard}/MemberCardActivateUserFormRequest.java (91%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{ => membercard}/MemberCardActivateUserFormResult.java (91%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{ => membercard}/MemberCardCreateRequest.java (92%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{ => membercard}/MemberCardUpdate.java (93%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{ => membercard}/MemberCardUpdateRequest.java (92%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{ => membercard}/MemberCardUserForm.java (97%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{ => membercard}/MemberCardUserFormRichField.java (89%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/MemberCardUserInfo.java (86%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/NameValues.java (85%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/NotifyOptional.java (95%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/WxMpMemberCardActivateTempInfoResult.java (90%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/WxMpMemberCardActivatedMessage.java (97%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/WxMpMemberCardCreateMessage.java (84%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/WxMpMemberCardUpdateMessage.java (97%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/WxMpMemberCardUpdateResult.java (94%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/WxMpMemberCardUserInfoResult.java (95%)
 rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/WxMpMemberCardUpdateResultTest.java (93%)
 rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{ => card}/membercard/WxMpMemberCardUserInfoResultTest.java (98%)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java
index 579ae34633..07572bb500 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java
@@ -2,11 +2,11 @@
 
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.bean.card.CardUpdateResult;
-import me.chanjar.weixin.mp.bean.card.MemberCardActivateUserFormRequest;
-import me.chanjar.weixin.mp.bean.card.MemberCardActivateUserFormResult;
-import me.chanjar.weixin.mp.bean.card.MemberCardUpdateRequest;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardActivateUserFormRequest;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardActivateUserFormResult;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardUpdateRequest;
 import me.chanjar.weixin.mp.bean.card.WxMpCardCreateResult;
-import me.chanjar.weixin.mp.bean.membercard.*;
+import me.chanjar.weixin.mp.bean.card.membercard.*;
 
 /**
  * 会员卡相关接口.
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java
index dc70a7b9d0..4f4471b2bb 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java
@@ -6,7 +6,7 @@
 import java.util.Map;
 
 import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.mp.bean.membercard.*;
+import me.chanjar.weixin.mp.bean.card.membercard.*;
 import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import org.apache.commons.lang3.StringUtils;
 
@@ -24,11 +24,11 @@
 import me.chanjar.weixin.mp.bean.card.BaseInfo;
 import me.chanjar.weixin.mp.bean.card.CardUpdateResult;
 import me.chanjar.weixin.mp.bean.card.DateInfo;
-import me.chanjar.weixin.mp.bean.card.MemberCard;
-import me.chanjar.weixin.mp.bean.card.MemberCardActivateUserFormRequest;
-import me.chanjar.weixin.mp.bean.card.MemberCardActivateUserFormResult;
-import me.chanjar.weixin.mp.bean.card.MemberCardCreateRequest;
-import me.chanjar.weixin.mp.bean.card.MemberCardUpdateRequest;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCard;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardActivateUserFormRequest;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardActivateUserFormResult;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardCreateRequest;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardUpdateRequest;
 import me.chanjar.weixin.mp.bean.card.WxMpCardCreateResult;
 import me.chanjar.weixin.mp.bean.card.enums.BusinessServiceType;
 import me.chanjar.weixin.mp.bean.card.enums.CardColor;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/ActivatePluginParam.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/ActivatePluginParam.java
similarity index 85%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/ActivatePluginParam.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/ActivatePluginParam.java
index 526ff5cc05..1ce8ef128c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/ActivatePluginParam.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/ActivatePluginParam.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/ActivatePluginParamResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/ActivatePluginParamResult.java
similarity index 78%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/ActivatePluginParamResult.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/ActivatePluginParamResult.java
index 4f060557d6..8e7be799a4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/ActivatePluginParamResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/ActivatePluginParamResult.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import lombok.Data;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCard.java
similarity index 98%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCard.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCard.java
index 76d7f2175c..5d23f5edb3 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCard.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCard.java
@@ -1,9 +1,10 @@
-package me.chanjar.weixin.mp.bean.card;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import java.io.Serializable;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
+import me.chanjar.weixin.mp.bean.card.*;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardActivateUserFormRequest.java
similarity index 91%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormRequest.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardActivateUserFormRequest.java
index 3d9a968765..8dd758c372 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormRequest.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardActivateUserFormRequest.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.card;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import com.google.gson.JsonObject;
 import com.google.gson.annotations.SerializedName;
@@ -46,8 +46,9 @@ public void setBindOldCard(String name, String url) {
     if (StringUtils.isAnyEmpty(name, url)) {
       return;
     }
-    if (bindOldCard == null)
+    if (bindOldCard == null) {
       bindOldCard = new JsonObject();
+    }
     bindOldCard.addProperty("name", name);
     bindOldCard.addProperty("url", url);
   }
@@ -62,8 +63,9 @@ public void setServiceStatement(String name, String url) {
     if (StringUtils.isAnyEmpty(name, url)) {
       return;
     }
-    if (serviceStatement == null)
+    if (serviceStatement == null) {
       serviceStatement = new JsonObject();
+    }
     serviceStatement.addProperty("name", name);
     serviceStatement.addProperty("url", url);
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardActivateUserFormResult.java
similarity index 91%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormResult.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardActivateUserFormResult.java
index 381feda142..8346770bf4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardActivateUserFormResult.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.card;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import java.io.Serializable;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardCreateRequest.java
similarity index 92%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardCreateRequest.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardCreateRequest.java
index 5abdf73310..9fb94e9ffa 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardCreateRequest.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardCreateRequest.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.card;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUpdate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUpdate.java
similarity index 93%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUpdate.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUpdate.java
index 00333117a5..7220de7e50 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUpdate.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUpdate.java
@@ -1,7 +1,11 @@
-package me.chanjar.weixin.mp.bean.card;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
+import me.chanjar.weixin.mp.bean.card.BaseInfoUpdate;
+import me.chanjar.weixin.mp.bean.card.BonusRule;
+import me.chanjar.weixin.mp.bean.card.CustomCell1;
+import me.chanjar.weixin.mp.bean.card.CustomField;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUpdateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUpdateRequest.java
similarity index 92%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUpdateRequest.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUpdateRequest.java
index 8c1f85351e..75aa990493 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUpdateRequest.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUpdateRequest.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.card;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserForm.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserForm.java
similarity index 97%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserForm.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserForm.java
index 1087af38a6..9edc0f89b4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserForm.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserForm.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.card;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import java.io.Serializable;
 import java.util.ArrayList;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserFormRichField.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserFormRichField.java
similarity index 89%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserFormRichField.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserFormRichField.java
index e109ebc66f..a9837029df 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserFormRichField.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserFormRichField.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.card;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -31,7 +31,7 @@ public class MemberCardUserFormRichField {
 
   public void add(String value) {
     if (valueList == null) {
-      valueList = new ArrayList();
+      valueList = new ArrayList<>();
     }
     valueList.add(value);
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/MemberCardUserInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserInfo.java
similarity index 86%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/MemberCardUserInfo.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserInfo.java
index c039d72a15..e411e19e96 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/MemberCardUserInfo.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/MemberCardUserInfo.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import lombok.Data;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/NameValues.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/NameValues.java
similarity index 85%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/NameValues.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/NameValues.java
index f285855535..32275e8ce6 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/NameValues.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/NameValues.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import lombok.Data;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/NotifyOptional.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/NotifyOptional.java
similarity index 95%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/NotifyOptional.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/NotifyOptional.java
index c4d25c97e8..139db68557 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/NotifyOptional.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/NotifyOptional.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivateTempInfoResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardActivateTempInfoResult.java
similarity index 90%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivateTempInfoResult.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardActivateTempInfoResult.java
index 120e326701..07b2d25719 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivateTempInfoResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardActivateTempInfoResult.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivatedMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardActivatedMessage.java
similarity index 97%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivatedMessage.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardActivatedMessage.java
index 9b1ac647cc..b7379dfb86 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardActivatedMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardActivatedMessage.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardCreateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardCreateMessage.java
similarity index 84%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardCreateMessage.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardCreateMessage.java
index d8842c73db..c1979751f8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardCreateMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardCreateMessage.java
@@ -1,10 +1,9 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import java.io.Serializable;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.bean.card.MemberCardCreateRequest;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 @Data
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateMessage.java
similarity index 97%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateMessage.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateMessage.java
index 526055b760..86d3c0aff9 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateMessage.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateResult.java
similarity index 94%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResult.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateResult.java
index 7b9dfb4926..663fe1f1e5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateResult.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import java.io.Serializable;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUserInfoResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUserInfoResult.java
similarity index 95%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUserInfoResult.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUserInfoResult.java
index fca7da928a..8fad40ccf8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUserInfoResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUserInfoResult.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import java.io.Serializable;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
index b7a4df93f5..82e2b36318 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
@@ -9,9 +9,9 @@
 import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
 import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
 import me.chanjar.weixin.mp.bean.material.*;
-import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivateTempInfoResult;
-import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult;
-import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult;
+import me.chanjar.weixin.mp.bean.card.membercard.WxMpMemberCardActivateTempInfoResult;
+import me.chanjar.weixin.mp.bean.card.membercard.WxMpMemberCardUpdateResult;
+import me.chanjar.weixin.mp.bean.card.membercard.WxMpMemberCardUserInfoResult;
 import me.chanjar.weixin.mp.bean.result.*;
 import me.chanjar.weixin.mp.bean.subscribe.WxMpSubscribeMessage;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardActivateTempInfoResultGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardActivateTempInfoResultGsonAdapter.java
index a38a27aa01..fc554c4807 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardActivateTempInfoResultGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardActivateTempInfoResultGsonAdapter.java
@@ -2,9 +2,9 @@
 
 import com.google.gson.*;
 import me.chanjar.weixin.common.util.json.GsonHelper;
-import me.chanjar.weixin.mp.bean.membercard.MemberCardUserInfo;
-import me.chanjar.weixin.mp.bean.membercard.NameValues;
-import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardActivateTempInfoResult;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardUserInfo;
+import me.chanjar.weixin.mp.bean.card.membercard.NameValues;
+import me.chanjar.weixin.mp.bean.card.membercard.WxMpMemberCardActivateTempInfoResult;
 
 import java.lang.reflect.Type;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardUpdateResultGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardUpdateResultGsonAdapter.java
index 0d45946311..2690d3416b 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardUpdateResultGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardUpdateResultGsonAdapter.java
@@ -6,7 +6,7 @@
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParseException;
 import me.chanjar.weixin.common.util.json.GsonHelper;
-import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUpdateResult;
+import me.chanjar.weixin.mp.bean.card.membercard.WxMpMemberCardUpdateResult;
 
 import java.lang.reflect.Type;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardUserInfoResultGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardUserInfoResultGsonAdapter.java
index 82790a0b0d..270e67e8eb 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardUserInfoResultGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMemberCardUserInfoResultGsonAdapter.java
@@ -9,9 +9,9 @@
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParseException;
 import me.chanjar.weixin.common.util.json.GsonHelper;
-import me.chanjar.weixin.mp.bean.membercard.MemberCardUserInfo;
-import me.chanjar.weixin.mp.bean.membercard.NameValues;
-import me.chanjar.weixin.mp.bean.membercard.WxMpMemberCardUserInfoResult;
+import me.chanjar.weixin.mp.bean.card.membercard.MemberCardUserInfo;
+import me.chanjar.weixin.mp.bean.card.membercard.NameValues;
+import me.chanjar.weixin.mp.bean.card.membercard.WxMpMemberCardUserInfoResult;
 
 import static me.chanjar.weixin.common.util.json.GsonHelper.getString;
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java
index 7f611ab8a9..73dcb22a2a 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java
@@ -7,7 +7,7 @@
 import me.chanjar.weixin.mp.api.test.ApiTestModule;
 import me.chanjar.weixin.mp.bean.card.*;
 import me.chanjar.weixin.mp.bean.card.enums.CardSceneType;
-import me.chanjar.weixin.mp.bean.membercard.*;
+import me.chanjar.weixin.mp.bean.card.membercard.*;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateResultTest.java
similarity index 93%
rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateResultTest.java
index 573fa2860f..f414967557 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUpdateResultTest.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import org.testng.annotations.Test;
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUserInfoResultTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUserInfoResultTest.java
similarity index 98%
rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUserInfoResultTest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUserInfoResultTest.java
index da8ff3da36..714ec97280 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUserInfoResultTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/card/membercard/WxMpMemberCardUserInfoResultTest.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.mp.bean.membercard;
+package me.chanjar.weixin.mp.bean.card.membercard;
 
 import org.testng.annotations.Test;
 

From 4d1440912dc25b1a9e82eb95e58434b0b61150cf Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Mon, 20 Jul 2020 00:00:44 +0800
Subject: [PATCH 52/90] =?UTF-8?q?:bookmark:=20=20=E5=8F=91=E5=B8=83=203.8.?=
 =?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 +-
 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 +-
 13 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/pom.xml b/pom.xml
index 932f1cd25f..f49e0cf68d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
   4.0.0
   com.github.binarywang
   wx-java
-  3.8.5.B
+  3.8.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 a72e0ff2ed..03f9b421ac 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.5.B
+    3.8.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 fe81fa9b59..d7f1605ef1 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.5.B
+    3.8.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 c0d3e686b0..499eade578 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.5.B
+    3.8.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 8d7d719488..7b128332b3 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.5.B
+    3.8.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 cec9db07f8..8645c4cbe7 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.8.5.B
+    3.8.6.B
   
   4.0.0
 
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 814edabd62..23f9147b87 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.5.B
+    3.8.6.B
   
 
   weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 55738f1837..50f9db3357 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.5.B
+    3.8.6.B
   
 
   weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index e3f52ffaa8..807d70b6b1 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.5.B
+    3.8.6.B
   
 
   weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 7a60979956..8f9e51d77f 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.5.B
+    3.8.6.B
   
 
   weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 1b9a237c9a..c33fe51677 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.5.B
+    3.8.6.B
   
 
   weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index b04fab2f55..124b3a7350 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.5.B
+    3.8.6.B
   
 
   weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 9b730529a7..90d0160290 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
   
     com.github.binarywang
     wx-java
-    3.8.5.B
+    3.8.6.B
   
   4.0.0
 

From 04fb35d1ba6751c1682eb980398fc580888b6708 Mon Sep 17 00:00:00 2001
From: whhya <2458317501@qq.com>
Date: Tue, 21 Jul 2020 10:20:12 +0800
Subject: [PATCH 53/90] =?UTF-8?q?:bug:=20#1604=20=E4=BF=AE=E5=A4=8D?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=BC=80=E6=94=BE=E5=B9=B3=E5=8F=B0=E5=B8=90?=
 =?UTF-8?q?=E5=8F=B7=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?=
 =?UTF-8?q?,=E4=BD=BF=E7=94=A8=E6=8C=87=E5=AE=9AappId=E7=9A=84access=5Ftok?=
 =?UTF-8?q?en?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* fix:修改微信开放平台帐号管理相关接口,使用指定appId的access_token,非开放平台自身的component_access_token
---
 .../chanjar/weixin/common/api/WxConsts.java   | 14 +++++-
 .../open/api/WxOpenComponentService.java      | 16 ++++---
 .../api/impl/WxOpenComponentServiceImpl.java  | 45 ++++++++++++++-----
 3 files changed, 58 insertions(+), 17 deletions(-)

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 e63b4a8c6b..7f1dcdf023 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
@@ -394,5 +394,17 @@ public static class NetCheckArgs {
     public static final String OPERATORDEFAULT = "DEFAULT";
   }
 
-
+  /**
+   * appId 类型
+   */
+  public static class AppIdType {
+    /**
+     * 公众号appId类型
+     */
+    public static final String MP_TYPE = "mp";
+    /**
+     * 小程序appId类型
+     */
+    public static final String MINI_TYPE = "mini";
+  }
 }
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 4e0a2bccf5..68dfb3d60b 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
@@ -415,43 +415,47 @@ public interface WxOpenComponentService {
    * 创建 开放平台帐号并绑定公众号/小程序.
    * https://api.weixin.qq.com/cgi-bin/open/create
    *
-   * @param appId 公众号/小程序的appId
+   * @param appId     公众号/小程序的appId
+   * @param appIdType appId类型   me.chanjar.weixin.common.api.WxConsts.AppIdType   mp-公众号  mini-小程序
    * @return . wx open create result
    * @throws WxErrorException .
    */
-  WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException;
+  WxOpenCreateResult createOpenAccount(String appId, String appIdType) throws WxErrorException;
 
   /**
    * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/bind.html
    * 将公众号/小程序绑定到开放平台帐号下
    *
    * @param appId     公众号/小程序的appId
+   * @param appIdType appId类型   me.chanjar.weixin.common.api.WxConsts.AppIdType   mp-公众号  mini-小程序
    * @param openAppid 开放平台帐号 appid,由创建开发平台帐号接口返回
    * @return the boolean
    * @throws WxErrorException the wx error exception
    */
-  Boolean bindOpenAccount(String appId, String openAppid) throws WxErrorException;
+  Boolean bindOpenAccount(String appId, String appIdType, String openAppid) throws WxErrorException;
 
   /**
    * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/unbind.html
    * 将公众号/小程序从开放平台帐号下解绑
    *
    * @param appId     公众号/小程序的appId
+   * @param appIdType appId类型   me.chanjar.weixin.common.api.WxConsts.AppIdType   mp-公众号  mini-小程序
    * @param openAppid 开放平台帐号 appid,由创建开发平台帐号接口返回
    * @return the boolean
    * @throws WxErrorException the wx error exception
    */
-  Boolean unbindOpenAccount(String appId, String openAppid) throws WxErrorException;
+  Boolean unbindOpenAccount(String appId, String appIdType, String openAppid) throws WxErrorException;
 
   /**
    * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/get.html
    * 获取公众号/小程序所绑定的开放平台帐号
    *
-   * @param appId 公众号/小程序的appId
+   * @param appId     公众号/小程序的appId
+   * @param appIdType appId类型   me.chanjar.weixin.common.api.WxConsts.AppIdType   mp-公众号  mini-小程序
    * @return 开放平台帐号 appid,由创建开发平台帐号接口返回
    * @throws WxErrorException the wx error exception
    */
-  WxOpenGetResult getOpenAccount(String appId) throws WxErrorException;
+  WxOpenGetResult getOpenAccount(String appId, String appIdType) throws WxErrorException;
 
   /**
    * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
index 5e54929a04..fe2a782e49 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
@@ -5,6 +5,7 @@
 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.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.crypto.SHA1;
@@ -474,47 +475,71 @@ public void deleteTemplate(long templateId) throws WxErrorException {
     post(DELETE_TEMPLATE_URL, param.toString(), "access_token");
   }
 
+  /**
+   * 微信开放平台帐号管理统一请求入口
+   *
+   * @param appId      操作appId 小程序/公众号
+   * @param appIdType  操作类型   小程序/公众号
+   * @param requestUrl 请求地址
+   * @param param      请求参数
+   * @return 请求结果
+   * @throws WxErrorException
+   */
+  private String openAccountServicePost(String appId, String appIdType, String requestUrl, JsonObject param) throws WxErrorException {
+    String result = "";
+    switch (appIdType) {
+      case WxConsts.AppIdType.MP_TYPE:
+        WxMpService wxMpService = this.getWxMpServiceByAppid(appId);
+        result = wxMpService.post(requestUrl, param.toString());
+        return result;
+      case WxConsts.AppIdType.MINI_TYPE:
+        WxOpenMaService maService = this.getWxMaServiceByAppid(appId);
+        result = maService.post(requestUrl, param.toString());
+        return result;
+      default:
+        throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("appIdType类型异常").build());
+    }
+  }
+
   @Override
-  public WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException {
+  public WxOpenCreateResult createOpenAccount(String appId, String appIdType) throws WxErrorException {
     JsonObject param = new JsonObject();
     param.addProperty("appid", appId);
 
-    String json = post(CREATE_OPEN_URL, param.toString(), "access_token");
+    String json = openAccountServicePost(appId, appIdType, CREATE_OPEN_URL, param);
 
     return WxOpenCreateResult.fromJson(json);
   }
 
 
   @Override
-  public Boolean bindOpenAccount(String appId, String openAppid) throws WxErrorException {
+  public Boolean bindOpenAccount(String appId, String appIdType, String openAppid) throws WxErrorException {
     JsonObject param = new JsonObject();
     param.addProperty("appid", appId);
     param.addProperty("open_appid", openAppid);
 
-    String json = post(BIND_OPEN_URL, param.toString(), "access_token");
-
+    String json = openAccountServicePost(appId, appIdType, BIND_OPEN_URL, param);
     return WxOpenResult.fromJson(json).isSuccess();
   }
 
 
   @Override
-  public Boolean unbindOpenAccount(String appId, String openAppid) throws WxErrorException {
+  public Boolean unbindOpenAccount(String appId, String appIdType, String openAppid) throws WxErrorException {
     JsonObject param = new JsonObject();
     param.addProperty("appid", appId);
     param.addProperty("open_appid", openAppid);
 
-    String json = post(UNBIND_OPEN_URL, param.toString(), "access_token");
-
+    String json = openAccountServicePost(appId, appIdType, UNBIND_OPEN_URL, param);
     return WxOpenResult.fromJson(json).isSuccess();
   }
 
 
   @Override
-  public WxOpenGetResult getOpenAccount(String appId) throws WxErrorException {
+  public WxOpenGetResult getOpenAccount(String appId, String appIdType) throws WxErrorException {
     JsonObject param = new JsonObject();
     param.addProperty("appid", appId);
 
-    String json = post(GET_OPEN_URL, param.toString(), "access_token");
+    String json = openAccountServicePost(appId, appIdType, GET_OPEN_URL, param);
     return WxOpenGetResult.fromJson(json);
   }
 

From 0758049ea94e3a480472287e13ff0d0780563a70 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=88=B1=E5=9B=A0=E6=96=AF=E5=94=90?=
 
Date: Tue, 21 Jul 2020 10:23:56 +0800
Subject: [PATCH 54/90] =?UTF-8?q?:new:=20#1474=20=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=88=B7=E8=81=94?=
 =?UTF-8?q?=E7=B3=BB=E3=80=8C=E8=81=94=E7=B3=BB=E6=88=91=E3=80=8D=E7=AE=A1?=
 =?UTF-8?q?=E7=90=86=E6=8E=A5=E5=8F=A3=20=E4=BF=AE=E6=AD=A3=20=20/=20#1590?=
 =?UTF-8?q?=20=E5=BC=80=E6=94=BE=E5=B9=B3=E5=8F=B0=E5=88=B7=E6=96=B0Access?=
 =?UTF-8?q?Token=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0RefreshToken?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* #1474 新增客户联系「联系我」管理接口

* fix #1590 提及的me.chanjar.weixin.open.api.impl.WxOpenComponentServiceImpl#getAuthorizerAccessToken()刷新AccessToken后没有同步对应的refreshToken

* 补充 me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage#updateToken 方法对 expireInSeconds 边界判断
---
 .../cp/api/WxCpExternalContactService.java    |  78 +++++++
 .../impl/WxCpExternalContactServiceImpl.java  |  66 ++++++
 .../weixin/cp/bean/WxCpContactWayInfo.java    | 198 ++++++++++++++++++
 .../weixin/cp/bean/WxCpContactWayResult.java  |  18 ++
 .../weixin/cp/constant/WxCpApiPathConsts.java |   5 +
 .../cp/util/json/WxCpConclusionAdapter.java   | 123 +++++++++++
 .../WxCpExternalContactServiceImplTest.java   |  54 +++++
 .../weixin/open/api/WxOpenConfigStorage.java  |   7 +
 .../api/impl/WxOpenComponentServiceImpl.java  |   5 +-
 .../api/impl/WxOpenInMemoryConfigStorage.java |   7 +-
 .../bean/WxOpenAuthorizerAccessToken.java     |  20 +-
 ...xOpenAuthorizerAccessTokenGsonAdapter.java |   1 +
 12 files changed, 563 insertions(+), 19 deletions(-)
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayResult.java
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.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 2b3a17b87d..8c0ea96852 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
@@ -1,5 +1,6 @@
 package me.chanjar.weixin.cp.api;
 
+import lombok.NonNull;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.cp.bean.*;
 
@@ -15,6 +16,83 @@
  * @author JoeCao
  */
 public interface WxCpExternalContactService {
+
+  /**
+   * 配置客户联系「联系我」方式
+   * 
+   * 企业可以在管理后台-客户联系中配置成员的「联系我」的二维码或者小程序按钮,客户通过扫描二维码或点击小程序上的按钮,即可获取成员联系方式,主动联系到成员。
+   * 企业可通过此接口为具有客户联系功能的成员生成专属的「联系我」二维码或者「联系我」按钮。
+   * 如果配置的是「联系我」按钮,需要开发者的小程序接入小程序插件。
+   *
+   * 注意:
+   * 通过API添加的「联系我」不会在管理端进行展示,每个企业可通过API最多配置50万个「联系我」。
+   * 用户需要妥善存储返回的config_id,config_id丢失可能导致用户无法编辑或删除「联系我」。
+   * 临时会话模式不占用「联系我」数量,但每日最多添加10万个,并且仅支持单人。
+   * 临时会话模式的二维码,添加好友完成后该二维码即刻失效。
+   * 
+ * + * @param info 客户联系「联系我」方式 + * @return + * @throws WxErrorException + */ + WxCpContactWayResult addContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException; + + /** + * 获取企业已配置的「联系我」方式 + * + *
+   * 批量获取企业配置的「联系我」二维码和「联系我」小程序按钮。
+   * 
+ * + * @param configId 联系方式的配置id,必填 + * @return + * @throws WxErrorException + */ + WxCpContactWayInfo getContactWay(@NonNull String configId) throws WxErrorException; + + /** + * 更新企业已配置的「联系我」方式 + * + *
+   * 更新企业配置的「联系我」二维码和「联系我」小程序按钮中的信息,如使用人员和备注等。
+   * 
+ * + * @param info 客户联系「联系我」方式 + * @return + * @throws WxErrorException + */ + WxCpBaseResp updateContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException; + + /** + * 删除企业已配置的「联系我」方式 + * + *
+   * 删除一个已配置的「联系我」二维码或者「联系我」小程序按钮。
+   * 
+ * + * @param configId 企业联系方式的配置id,必填 + * @return + * @throws WxErrorException + */ + WxCpBaseResp deleteContactWay(@NonNull String configId) throws WxErrorException; + + /** + * 结束临时会话 + * + *
+   * 将指定的企业成员和客户之前的临时会话断开,断开前会自动下发已配置的结束语。
+   *
+   * 注意:请保证传入的企业成员和客户之间有仍然有效的临时会话, 通过其他方式的添加外部联系人无法通过此接口关闭会话。
+   * 
+ * + * @param userId + * @param externalUserId + * @return + * @throws WxErrorException + */ + WxCpBaseResp closeTempChat(@NonNull String userId, @NonNull String externalUserId) 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 982c115502..371015b415 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
@@ -2,6 +2,7 @@
 
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.error.WxCpErrorMsgEnum;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -9,6 +10,7 @@
 import me.chanjar.weixin.cp.api.WxCpService;
 import me.chanjar.weixin.cp.bean.*;
 import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.Collections;
 import java.util.Date;
@@ -23,6 +25,70 @@
 public class WxCpExternalContactServiceImpl implements WxCpExternalContactService {
   private final WxCpService mainService;
 
+  @Override
+  public WxCpContactWayResult addContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException {
+
+    if (info.getUsers() != null && info.getUsers().size() > 100) {
+      throw new RuntimeException("「联系我」使用人数默认限制不超过100人(包括部门展开后的人数)");
+    }
+
+    final String url = this.mainService.getWxCpConfigStorage().getApiUrl(ADD_CONTACT_WAY);
+    String responseContent = this.mainService.post(url, info.toJson());
+
+    return WxCpContactWayResult.fromJson(responseContent);
+  }
+
+  @Override
+  public WxCpContactWayInfo getContactWay(@NonNull String configId) throws WxErrorException {
+    JsonObject json = new JsonObject();
+    json.addProperty("config_id", configId);
+
+    final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CONTACT_WAY);
+    String responseContent = this.mainService.post(url, json.toString());
+
+    return WxCpContactWayInfo.fromJson(responseContent);
+  }
+
+  @Override
+  public WxCpBaseResp updateContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException {
+    if (StringUtils.isBlank(info.getConfigId())) {
+      throw new RuntimeException("更新「联系我」方式需要指定configId");
+    }
+    if (info.getUsers() != null && info.getUsers().size() > 100) {
+      throw new RuntimeException("「联系我」使用人数默认限制不超过100人(包括部门展开后的人数)");
+    }
+
+    final String url = this.mainService.getWxCpConfigStorage().getApiUrl(UPDATE_CONTACT_WAY);
+    String responseContent = this.mainService.post(url, info.toJson());
+
+    return WxCpBaseResp.fromJson(responseContent);
+  }
+
+  @Override
+  public WxCpBaseResp deleteContactWay(@NonNull String configId) throws WxErrorException {
+    JsonObject json = new JsonObject();
+    json.addProperty("config_id",configId);
+
+    final String url = this.mainService.getWxCpConfigStorage().getApiUrl(DEL_CONTACT_WAY);
+    String responseContent = this.mainService.post(url, json.toString());
+
+    return WxCpBaseResp.fromJson(responseContent);
+  }
+
+  @Override
+  public WxCpBaseResp closeTempChat(@NonNull String userId, @NonNull String externalUserId) throws WxErrorException {
+
+    JsonObject json = new JsonObject();
+    json.addProperty("userid",userId);
+    json.addProperty("external_userid",externalUserId);
+
+
+    final String url = this.mainService.getWxCpConfigStorage().getApiUrl(CLOSE_TEMP_CHAT);
+    String responseContent = this.mainService.post(url, json.toString());
+
+    return WxCpBaseResp.fromJson(responseContent);
+  }
+
   @Override
   public WxCpUserExternalContactInfo getExternalContact(String userId) throws WxErrorException {
     final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_EXTERNAL_CONTACT + userId);
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java
new file mode 100644
index 0000000000..3f62e4f0e4
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java
@@ -0,0 +1,198 @@
+package me.chanjar.weixin.cp.bean;
+
+import com.google.gson.annotations.JsonAdapter;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.cp.util.json.WxCpConclusionAdapter;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 「联系我」方式 对象
+ *
+ * @author element
+ */
+@Data
+@NoArgsConstructor
+public class WxCpContactWayInfo {
+
+  /**
+   * 联系方式的配置id
+   */
+  @SerializedName("config_id")
+  private String configId;
+
+  /**
+   * 
+   * 必填
+   * 联系方式类型,1-单人, 2-多人
+   * 
+ */ + private TYPE type; + + /** + *
+   * 必填
+   * 场景,1-在小程序中联系,2-通过二维码联系
+   * 
+ */ + private SCENE scene; + + /** + *
+   * 非必填
+   * 在小程序中联系时使用的控件样式
+   * 单人样式(type=1)时可选1,2,3
+   * 多人样式(type=2)时可选1,2
+   * 
+ */ + private Integer style; + + /** + *
+   * 非必填
+   * 联系方式的备注信息,用于助记,不超过30个字符
+   * 
+ */ + private String remark; + + /** + *
+   * 非必填
+   * 外部客户添加时是否无需验证,默认为true
+   * 
+ */ + @SerializedName("skip_verify") + private Boolean skipVerify = Boolean.TRUE; + + /** + *
+   * 非必填
+   * 企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情(WxCpExternalContactService.getContactDetail)”  时会返回该参数值,不超过30个字符
+   * 
+ */ + private String state; + + /** + *
+   * 使用该联系方式的用户userID列表,在type为1时为必填,且只能有一个
+   * 
+ */ + @SerializedName("user") + private List users; + + + /** + *
+   * 非必填
+   * 使用该联系方式的部门id列表,只在type为2时有效
+   * 
+ */ + @SerializedName("party") + private List partys; + + /** + *
+   * 非必填
+   * 是否临时会话模式,true表示使用临时会话模式,默认为false
+   * 
+ */ + @SerializedName("is_temp") + private Boolean isTemp = Boolean.FALSE; + + /** + *
+   * 非必填
+   * 临时会话二维码有效期,以秒为单位。该参数仅在is_temp为true时有效,默认7天
+   * 
+ */ + @SerializedName("expires_in") + private Integer expiresIn; + + /** + *
+   * 非必填
+   * 临时会话有效期,以秒为单位。该参数仅在is_temp为true时有效,默认为添加好友后24小时
+   * 
+ */ + @SerializedName("chat_expires_in") + private Integer chatExpiresIn; + + /** + *
+   * 非必填
+   * 可进行临时会话的客户unionid,该参数仅在is_temp为true时有效,如不指定则不进行限制
+   * 
+ */ + @SerializedName("unionid") + private String unionId; + + /** + *
+   * 非必填
+   * 结束语,会话结束时自动发送给客户,可参考“结束语定义”,仅在is_temp为true时有效
+   * 
+ */ + private Conclusion conclusions; + + public static WxCpContactWayInfo fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpContactWayInfo.class); + } + + public String toJson() { + return WxCpGsonBuilder.create().toJson(this); + } + + /** + * 结束语定义 + */ + @Data + @JsonAdapter(WxCpConclusionAdapter.class) + public static class Conclusion { + private String textContent; + private String imgMediaId; + private String imgPicUrl; + private String linkTitle; + private String linkPicUrl; + private String linkDesc; + private String linkUrl; + private String miniProgramTitle; + private String miniProgramPicMediaId; + private String miniProgramAppId; + private String miniProgramPage; + } + + public enum TYPE { + /** + * 单人 + */ + @SerializedName("1") + SIGLE, + + /** + * 多人 + */ + @SerializedName("2") + MULTI; + + } + + public enum SCENE { + + /** + * 在小程序中联系 + */ + @SerializedName("1") + MINIPROGRAM, + + /** + * 通过二维码联系 + */ + @SerializedName("2") + QRCODE; + + } + +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayResult.java new file mode 100644 index 0000000000..89d58454d9 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayResult.java @@ -0,0 +1,18 @@ +package me.chanjar.weixin.cp.bean; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +/** + * 「联系我」方式 处理结果 + */ +@Data +public class WxCpContactWayResult extends WxCpBaseResp { + @SerializedName("config_id") + private String configId; + + 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/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java index 24debae397..72ababe77e 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 @@ -117,6 +117,11 @@ public static class ExternalContact { @Deprecated public static final String GET_EXTERNAL_CONTACT = "/cgi-bin/crm/get_external_contact?external_userid="; + public static final String ADD_CONTACT_WAY = "/cgi-bin/externalcontact/add_contact_way"; + public static final String GET_CONTACT_WAY = "/cgi-bin/externalcontact/get_contact_way"; + public static final String UPDATE_CONTACT_WAY = "/cgi-bin/externalcontact/update_contact_way"; + public static final String DEL_CONTACT_WAY = "/cgi-bin/externalcontact/del_contact_way"; + public static final String CLOSE_TEMP_CHAT = "/cgi-bin/externalcontact/close_temp_chat"; public static final String GET_FOLLOW_USER_LIST = "/cgi-bin/externalcontact/get_follow_user_list"; public static final String GET_CONTACT_DETAIL = "/cgi-bin/externalcontact/get?external_userid="; public static final String LIST_EXTERNAL_CONTACT = "/cgi-bin/externalcontact/list?userid="; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java new file mode 100644 index 0000000000..1a9aab8bf9 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java @@ -0,0 +1,123 @@ +package me.chanjar.weixin.cp.util.json; + +import com.google.gson.*; +import me.chanjar.weixin.cp.bean.WxCpContactWayInfo; +import org.apache.commons.lang3.StringUtils; + +import java.lang.reflect.Type; + +/** + * 结束语序列化转换器 + * + * @author element + */ +public class WxCpConclusionAdapter implements JsonSerializer, JsonDeserializer { + @Override + public WxCpContactWayInfo.Conclusion deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + JsonObject jsonObject = json.getAsJsonObject(); + + WxCpContactWayInfo.Conclusion conclusion = new WxCpContactWayInfo.Conclusion(); + + if (jsonObject.get("text") != null) { + JsonObject jsonText = jsonObject.get("text").getAsJsonObject(); + + if (jsonText.get("content") != null) { + conclusion.setTextContent(jsonText.get("content").getAsString()); + } + } + + if (jsonObject.get("image") != null) { + JsonObject jsonImage = jsonObject.get("image").getAsJsonObject(); + + if (jsonImage.get("media_id") != null) { + conclusion.setImgMediaId(jsonImage.get("media_id").getAsString()); + } + + if (jsonImage.get("pic_url") != null) { + conclusion.setImgPicUrl(jsonImage.get("pic_url").getAsString()); + } + } + + if (jsonObject.get("link") != null) { + JsonObject jsonLink = jsonObject.get("link").getAsJsonObject(); + + if (jsonLink.get("title") != null) { + conclusion.setLinkTitle(jsonLink.get("title").getAsString()); + } + if (jsonLink.get("picurl") != null) { + conclusion.setLinkPicUrl(jsonLink.get("picurl").getAsString()); + } + if (jsonLink.get("desc") != null) { + conclusion.setLinkDesc(jsonLink.get("desc").getAsString()); + } + if (jsonLink.get("url") != null) { + conclusion.setLinkUrl(jsonLink.get("url").getAsString()); + } + } + + if (jsonObject.get("miniprogram") != null) { + + JsonObject jsonMiniProgram = jsonObject.get("miniprogram").getAsJsonObject(); + if (jsonMiniProgram.get("title") != null) { + conclusion.setMiniProgramTitle(jsonMiniProgram.get("title").getAsString()); + } + if (jsonMiniProgram.get("pic_media_id") != null) { + conclusion.setMiniProgramPicMediaId(jsonMiniProgram.get("pic_media_id").getAsString()); + } + if (jsonMiniProgram.get("appid") != null) { + conclusion.setMiniProgramAppId(jsonMiniProgram.get("appid").getAsString()); + } + if (jsonMiniProgram.get("page") != null) { + conclusion.setMiniProgramPage(jsonMiniProgram.get("page").getAsString()); + } + + } + + return conclusion; + } + + @Override + public JsonElement serialize(WxCpContactWayInfo.Conclusion src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject json = new JsonObject(); + if (StringUtils.isNotBlank(src.getTextContent())) { + JsonObject jsonText = new JsonObject(); + jsonText.addProperty("content", src.getTextContent()); + json.add("text", jsonText); + } + + if (StringUtils.isNotBlank(src.getImgMediaId()) || StringUtils.isNotBlank(src.getImgPicUrl())) { + JsonObject jsonImg = new JsonObject(); + jsonImg.addProperty("media_id", src.getImgMediaId()); + jsonImg.addProperty("pic_url", src.getImgPicUrl()); + json.add("image", jsonImg); + } + + if (StringUtils.isNotBlank(src.getLinkTitle()) + || StringUtils.isNotBlank(src.getLinkPicUrl()) + || StringUtils.isNotBlank(src.getLinkDesc()) + || StringUtils.isNotBlank(src.getLinkUrl()) + ) { + JsonObject jsonLink = new JsonObject(); + jsonLink.addProperty("title", src.getLinkTitle()); + jsonLink.addProperty("picurl", src.getLinkPicUrl()); + jsonLink.addProperty("desc", src.getLinkDesc()); + jsonLink.addProperty("url", src.getLinkUrl()); + json.add("link", jsonLink); + } + + if (StringUtils.isNotBlank(src.getMiniProgramTitle()) + || StringUtils.isNotBlank(src.getMiniProgramPicMediaId()) + || StringUtils.isNotBlank(src.getMiniProgramAppId()) + || StringUtils.isNotBlank(src.getMiniProgramPage()) + ) { + JsonObject jsonMiniProgram = new JsonObject(); + jsonMiniProgram.addProperty("title", src.getMiniProgramTitle()); + jsonMiniProgram.addProperty("pic_media_id", src.getMiniProgramPicMediaId()); + jsonMiniProgram.addProperty("appid", src.getMiniProgramAppId()); + jsonMiniProgram.addProperty("page", src.getMiniProgramPage()); + json.add("miniprogram", jsonMiniProgram); + } + + return json; + } +} 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 309b14bc26..da04bc6c0f 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 @@ -1,13 +1,18 @@ package me.chanjar.weixin.cp.api.impl; +import com.google.common.collect.Lists; import com.google.inject.Inject; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.api.ApiTestModule; import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.WxCpBaseResp; +import me.chanjar.weixin.cp.bean.WxCpContactWayInfo; import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo; +import org.apache.commons.lang3.time.DateFormatUtils; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import java.util.Date; import java.util.List; import static org.testng.Assert.assertNotNull; @@ -28,6 +33,55 @@ public void testGetExternalContact() throws WxErrorException { assertNotNull(result); } + @Test + public void testAddContactWay() throws WxErrorException { + + final String concatUserId = "符合要求的userId"; + + WxCpContactWayInfo info = new WxCpContactWayInfo(); + info.setType(WxCpContactWayInfo.TYPE.SIGLE); + info.setScene(WxCpContactWayInfo.SCENE.MINIPROGRAM); + info.setUsers(Lists.newArrayList(concatUserId)); + info.setRemark("CreateDate:" + DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.format(new Date())); + this.wxCpService.getExternalContactService().addContactWay(info); + } + + @Test + public void testGetContactWay() throws WxErrorException { + final String configId = "2d7a68c657663afbd1d90db19a4b5ee9"; + WxCpContactWayInfo contactWayInfo = this.wxCpService.getExternalContactService().getContactWay(configId); + System.out.println(contactWayInfo); + assertNotNull(contactWayInfo); + } + + @Test + public void testUpdateContactWay() throws WxErrorException { + final String configId = "2d7a68c657663afbd1d90db19a4b5ee9"; + final String concatUserId = "符合要求的userId"; + WxCpContactWayInfo info = new WxCpContactWayInfo(); + info.setConfigId(configId); + info.setUsers(Lists.newArrayList(concatUserId)); + info.setRemark("CreateDate:" + DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.format(new Date())); + WxCpBaseResp resp = this.wxCpService.getExternalContactService().updateContactWay(info); + System.out.println(resp); + assertNotNull(resp); + } + + @Test + public void testDelContactWay() throws WxErrorException { + final String configId = "2d7a68c657663afbd1d90db19a4b5ee9"; + WxCpBaseResp resp = this.wxCpService.getExternalContactService().deleteContactWay(configId); + System.out.println(resp); + assertNotNull(resp); + } + + @Test + public void testCloseTempChat() throws WxErrorException { + final String externalUserId = "externalUserId"; + WxCpBaseResp resp = this.wxCpService.getExternalContactService().closeTempChat(userId, externalUserId); + System.out.println(resp); + } + @Test public void testListExternalContacts() throws WxErrorException { String userId = this.configStorage.getUserId(); diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java index 4d1c2b136d..4b496b30d3 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenConfigStorage.java @@ -208,6 +208,13 @@ public interface WxOpenConfigStorage { */ void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken); + /** + * setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) 方法重载方法 + * @param appId the app id + * @param authorizerRefreshToken the authorizer refresh token + */ + void updateAuthorizerRefreshToken(String appId, String authorizerRefreshToken); + /** * Gets authorizer 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 fe2a782e49..80961921f1 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 @@ -311,7 +311,7 @@ public WxOpenQueryAuthResult getQueryAuth(String authorizationCode) throws WxErr authorizationInfo.getAuthorizerAccessToken(), authorizationInfo.getExpiresIn()); } if (authorizationInfo.getAuthorizerRefreshToken() != null) { - getWxOpenConfigStorage().setAuthorizerRefreshToken(authorizationInfo.getAuthorizerAppid(), authorizationInfo.getAuthorizerRefreshToken()); + getWxOpenConfigStorage().updateAuthorizerRefreshToken(authorizationInfo.getAuthorizerAppid(), authorizationInfo.getAuthorizerRefreshToken()); } return queryAuth; } @@ -340,7 +340,7 @@ public WxOpenAuthorizerListResult getAuthorizerList(int begin, int len) throws W String authorizerAppid = data.get("authorizer_appid"); String refreshToken = data.get("refresh_token"); if (authorizerAppid != null && refreshToken != null) { - this.getWxOpenConfigStorage().setAuthorizerRefreshToken(authorizerAppid, refreshToken); + this.getWxOpenConfigStorage().updateAuthorizerRefreshToken(authorizerAppid, refreshToken); } } } @@ -391,6 +391,7 @@ public String getAuthorizerAccessToken(String appId, boolean forceRefresh) throw WxOpenAuthorizerAccessToken wxOpenAuthorizerAccessToken = WxOpenAuthorizerAccessToken.fromJson(responseContent); config.updateAuthorizerAccessToken(appId, wxOpenAuthorizerAccessToken); + config.updateAuthorizerRefreshToken(appId,wxOpenAuthorizerAccessToken.getAuthorizerRefreshToken()); return config.getAuthorizerAccessToken(appId); } catch (InterruptedException e) { throw new RuntimeException(e); diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java index 723ec3806e..a4859ba18c 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java @@ -142,7 +142,7 @@ private void updateToken(Map map, String key, String tokenString, map.put(key, token); } token.token = tokenString; - if (expiresInSeconds != null) { + if (expiresInSeconds != null && expiresInSeconds != -1) { token.expiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L; } } @@ -157,6 +157,11 @@ public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToke updateToken(authorizerRefreshTokens, appId, authorizerRefreshToken, null); } + @Override + public void updateAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { + this.setAuthorizerRefreshToken(appId, authorizerRefreshToken); + } + @Override public String getAuthorizerAccessToken(String appId) { return getTokenString(authorizerAccessTokens, appId); diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenAuthorizerAccessToken.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenAuthorizerAccessToken.java index 9b86412bb3..9a558ab776 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenAuthorizerAccessToken.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenAuthorizerAccessToken.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.open.bean; +import lombok.Data; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; import java.io.Serializable; @@ -7,30 +8,17 @@ /** * @author 007 */ +@Data public class WxOpenAuthorizerAccessToken implements Serializable { private static final long serialVersionUID = -4069745419280727420L; private String authorizerAccessToken; + private String authorizerRefreshToken; + private int expiresIn = -1; public static WxOpenAuthorizerAccessToken fromJson(String json) { return WxOpenGsonBuilder.create().fromJson(json, WxOpenAuthorizerAccessToken.class); } - - public String getAuthorizerAccessToken() { - return authorizerAccessToken; - } - - public void setAuthorizerAccessToken(String authorizerAccessToken) { - this.authorizerAccessToken = authorizerAccessToken; - } - - public int getExpiresIn() { - return expiresIn; - } - - public void setExpiresIn(int expiresIn) { - this.expiresIn = expiresIn; - } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerAccessTokenGsonAdapter.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerAccessTokenGsonAdapter.java index 82a04b9ba8..6932d25736 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerAccessTokenGsonAdapter.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerAccessTokenGsonAdapter.java @@ -15,6 +15,7 @@ public WxOpenAuthorizerAccessToken deserialize(JsonElement jsonElement, Type typ WxOpenAuthorizerAccessToken authorizerAccessToken = new WxOpenAuthorizerAccessToken(); JsonObject jsonObject = jsonElement.getAsJsonObject(); authorizerAccessToken.setAuthorizerAccessToken(GsonHelper.getString(jsonObject, "authorizer_access_token")); + authorizerAccessToken.setAuthorizerRefreshToken(GsonHelper.getString(jsonObject, "authorizer_refresh_token")); authorizerAccessToken.setExpiresIn(GsonHelper.getPrimitiveInteger(jsonObject, "expires_in")); return authorizerAccessToken; } From 694f2c2b961e0cbbf79210d32107a3abc30ae6ef Mon Sep 17 00:00:00 2001 From: huangxm129 <40385667+huangxm129@users.noreply.github.com> Date: Sun, 26 Jul 2020 23:08:56 +0800 Subject: [PATCH 55/90] =?UTF-8?q?:new:=20#1493=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=A2=9E=E5=8A=A0=E7=AE=A1=E7=90=86=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=AE=A2=E6=88=B7=E6=A0=87=E7=AD=BE=E7=9A=84=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 ++ .../cp/api/WxCpExternalContactService.java | 57 +++++++++++++++ .../impl/WxCpExternalContactServiceImpl.java | 66 ++++++++++++++++++ .../cp/bean/WxCpUserExternalTagGroup.java | 69 +++++++++++++++++++ .../weixin/cp/constant/WxCpApiPathConsts.java | 6 ++ .../WxCpExternalContactServiceImplTest.java | 68 ++++++++++++++++++ .../cp/api/impl/WxCpUserServiceImplTest.java | 2 +- 7 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroup.java diff --git a/pom.xml b/pom.xml index f49e0cf68d..a36f8a840c 100644 --- a/pom.xml +++ b/pom.xml @@ -90,6 +90,11 @@ liuxinghao1988@gmail.com https://github.com/howardliu-cn + + huangxiaoming + huangxiaoming@163.com + https://github.com/huangxm129 + 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 8c0ea96852..e1806d0977 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 @@ -246,4 +246,61 @@ public interface WxCpExternalContactService { WxCpUserExternalGroupChatStatistic getGroupChatStatistic(Date startTime, Integer orderBy, Integer orderAsc, Integer pageIndex, Integer pageSize, String[] userIds, String[] partyIds) throws WxErrorException; WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate) throws WxErrorException; + + + /** + *
+   * 企业可通过此接口获取企业客户标签详情。
+   * 
+ * @param tagId + * @return + */ + WxCpUserExternalTagGroup getCorpTagList(String [] tagId) throws WxErrorException; + + + /** + *
+   * 企业可通过此接口向客户标签库中添加新的标签组和标签,每个企业最多可配置3000个企业标签。
+   * 暂不支持第三方调用。
+   * 
+ * @param tagGroup + * @return + */ + WxCpUserExternalTagGroup addCorpTag(WxCpUserExternalTagGroup tagGroup)throws WxErrorException; + + /** + *
+   * 企业可通过此接口编辑客户标签/标签组的名称或次序值。
+   * 暂不支持第三方调用。
+   * 
+ * @param id + * @param name + * @param order + * @return + */ + WxCpBaseResp editCorpTag(String id,String name,Integer order)throws WxErrorException; + + /** + *
+   * 企业可通过此接口删除客户标签库中的标签,或删除整个标签组。
+   * 暂不支持第三方调用。
+   * 
+ * @param tagId + * @param groupId + * @return + */ + WxCpBaseResp delCorpTag(String [] tagId,String[] groupId)throws WxErrorException; + + /** + *
+   * 企业可通过此接口为指定成员的客户添加上由企业统一配置的标签。
+   * https://work.weixin.qq.com/api/doc/90000/90135/92117
+   * 
+ * @param userid + * @param externalUserid + * @param addTag + * @param removeTag + * @return + */ + 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 371015b415..01477c8547 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 @@ -223,4 +223,70 @@ public WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate) final String result = this.mainService.post(url, wxCpMsgTemplate.toJson()); return WxCpMsgTemplateAddResult.fromJson(result); } + + @Override + public WxCpUserExternalTagGroup getCorpTagList(String[] tagId) throws WxErrorException { + JsonObject json = new JsonObject(); + if(ArrayUtils.isNotEmpty(tagId)){ + json.add("tag_id",new Gson().toJsonTree(tagId).getAsJsonArray()); + } + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CORP_TAG_LIST); + final String result = this.mainService.post(url,json.toString()); + return WxCpUserExternalTagGroup.fromJson(result); + } + + @Override + public WxCpUserExternalTagGroup addCorpTag(WxCpUserExternalTagGroup tagGroup) throws WxErrorException{ + + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(ADD_CORP_TAG); + final String result = this.mainService.post(url,tagGroup.toJson()); + return WxCpUserExternalTagGroup.fromJson(result); + } + + @Override + public WxCpBaseResp editCorpTag(String id, String name, Integer order) throws WxErrorException{ + + JsonObject json = new JsonObject(); + json.addProperty("id",id); + json.addProperty("name",name); + json.addProperty("order",order); + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(EDIT_CORP_TAG); + final String result = this.mainService.post(url,json.toString()); + return WxCpBaseResp.fromJson(result); + } + + @Override + public WxCpBaseResp delCorpTag(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(tagId).getAsJsonArray()); + } + + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(DEL_CORP_TAG); + final String result = this.mainService.post(url,json.toString()); + return WxCpBaseResp.fromJson(result); + } + + @Override + public WxCpBaseResp markTag(String userid, String externalUserid, String[] addTag, String[] removeTag)throws WxErrorException{ + + + JsonObject json = new JsonObject(); + json.addProperty("userid",userid); + json.addProperty("external_userid",externalUserid); + + if(ArrayUtils.isNotEmpty(addTag)){ + json.add("add_tag",new Gson().toJsonTree(addTag).getAsJsonArray()); + } + if(ArrayUtils.isNotEmpty(removeTag)){ + json.add("remove_tag",new Gson().toJsonTree(removeTag).getAsJsonArray()); + } + + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(MARK_TAG); + final String result = this.mainService.post(url,json.toString()); + return WxCpBaseResp.fromJson(result); + } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroup.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroup.java new file mode 100644 index 0000000000..1dff12057b --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroup.java @@ -0,0 +1,69 @@ +package me.chanjar.weixin.cp.bean; + +import com.google.gson.annotations.SerializedName; +import lombok.Getter; +import lombok.Setter; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + +import java.util.List; + +/** + * + */ +@Getter +@Setter +public class WxCpUserExternalTagGroup extends WxCpBaseResp { + + @SerializedName("group_id") + private String groupId; + + @SerializedName("group_name") + private String groupName; + + @SerializedName("create_time") + private Long createTime; + + @SerializedName("order") + private Integer order; + + @SerializedName("deleted") + private Boolean deleted; + + + @SerializedName("tag") + private List tag; + + @Getter + @Setter + public static class Tag { + + /** + * 客户群ID + */ + @SerializedName("id") + private String id; + + + @SerializedName("name") + private String name; + + @SerializedName("create_time") + private Long createTime; + + @SerializedName("order") + private Integer order; + + @SerializedName("deleted") + private Boolean deleted; + + } + + public String toJson() { + return WxGsonBuilder.create().toJson(this); + } + + public static WxCpUserExternalTagGroup fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpUserExternalTagGroup.class); + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java index 72ababe77e..7f734a89b5 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 @@ -132,5 +132,11 @@ public static class ExternalContact { public static final String LIST_USER_BEHAVIOR_DATA = "/cgi-bin/externalcontact/get_user_behavior_data"; public static final String LIST_GROUP_CHAT_DATA = "/cgi-bin/externalcontact/groupchat/statistic"; public static final String ADD_MSG_TEMPLATE = "/cgi-bin/externalcontact/add_msg_template"; + + public static final String GET_CORP_TAG_LIST = "/cgi-bin/externalcontact/get_corp_tag_list"; + public static final String ADD_CORP_TAG = "/cgi-bin/externalcontact/add_corp_tag"; + public static final String EDIT_CORP_TAG = "/cgi-bin/externalcontact/edit_corp_tag"; + public static final String DEL_CORP_TAG = "/cgi-bin/externalcontact/del_corp_tag"; + public static final String MARK_TAG = "/cgi-bin/externalcontact/mark_tag"; } } 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 da04bc6c0f..f23108315e 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,10 +8,12 @@ import me.chanjar.weixin.cp.bean.WxCpBaseResp; import me.chanjar.weixin.cp.bean.WxCpContactWayInfo; import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo; +import me.chanjar.weixin.cp.bean.WxCpUserExternalTagGroup; import org.apache.commons.lang3.time.DateFormatUtils; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -105,4 +107,70 @@ public void testGetContactDetail() throws WxErrorException { assertNotNull(result); } + @Test + public void testGetCorpTagList() throws WxErrorException { + String tag[]={}; + WxCpUserExternalTagGroup result = this.wxCpService.getExternalContactService().getCorpTagList(null); + System.out.println(result); + assertNotNull(result); + } + + @Test + public void testAddCorpTag() throws WxErrorException { + + List list = new ArrayList<>(); + + WxCpUserExternalTagGroup.Tag tag = new WxCpUserExternalTagGroup.Tag(); + tag.setName("测试标签1"); + tag.setOrder(1); + list.add(tag); + + WxCpUserExternalTagGroup tagGroup = new WxCpUserExternalTagGroup(); + tagGroup.setGroupName("其他"); + tagGroup.setOrder(1); + tagGroup.setTag(list); + + WxCpUserExternalTagGroup result = this.wxCpService.getExternalContactService().addCorpTag(tagGroup); + + + + System.out.println(result); + assertNotNull(result); + } + + @Test + public void testEditCorpTag() throws WxErrorException { + + WxCpBaseResp result = this.wxCpService.getExternalContactService().editCorpTag("et2omCCwAArxYqGJQn4MNMS_zQKhIUfQ", "未知", 2); + + System.out.println(result); + assertNotNull(result); + } + + @Test + public void testDelCorpTag() throws WxErrorException { + + String tagId[] = {"et2omCCwAArxYqGJQn4MNMS_zQKhIUfQ"}; + String groupId[] = {}; + + WxCpBaseResp result = this.wxCpService.getExternalContactService().delCorpTag(tagId,groupId); + + System.out.println(result); + assertNotNull(result); + } + + @Test + public void testMarkTag() throws WxErrorException { + + String userid="HuangXiaoMing"; + String externalUserid="wo2omCCwAAzR0Rt1omz-90o_XJkPGXIQ"; + String addTag[] = {"et2omCCwAAzdcSK-RV80YS9sbpCXlNlQ"}; + String removeTag[] = {}; + + WxCpBaseResp result = this.wxCpService.getExternalContactService().markTag(userid,externalUserid,addTag,removeTag); + + System.out.println(result); + assertNotNull(result); + } + } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java index 1f565fbffa..9c4448830e 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java @@ -73,7 +73,7 @@ public void testGetById() throws Exception { @Test public void testListByDepartment() throws Exception { - List users = this.wxCpService.getUserService().listByDepartment(1L, true, 0); + List users = this.wxCpService.getUserService().listByDepartment(2L, true, 0); assertNotEquals(users.size(), 0); for (WxCpUser user : users) { System.out.println(ToStringBuilder.reflectionToString(user, ToStringStyle.MULTI_LINE_STYLE)); From fbe2dd9268ac749a2bb3e72c5be603eccfdf076a Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 26 Jul 2020 23:19:17 +0800 Subject: [PATCH 56/90] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=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/bean/WxCpXmlMessage.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java index ccae5a4644..b32281df5e 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java @@ -405,8 +405,7 @@ public class WxCpXmlMessage implements Serializable { @XStreamAlias("ApprovalInfo") - private ApprovalInfo approvalInfo=new ApprovalInfo(); - + private ApprovalInfo approvalInfo = new ApprovalInfo(); protected static WxCpXmlMessage fromXml(String xml) { @@ -466,7 +465,8 @@ public static class ScanCodeInfo { } @Data - public static class ExtAttr { + public static class ExtAttr implements Serializable { + private static final long serialVersionUID = -3418685294606228837L; @XStreamImplicit(itemFieldName = "Item") protected final List items = new ArrayList<>(); @@ -486,7 +486,9 @@ public static class Item { @Data @XStreamAlias("SendPicsInfo") - public static class SendPicsInfo { + public static class SendPicsInfo implements Serializable { + private static final long serialVersionUID = -6549728838848064881L; + @XStreamAlias("PicList") protected final List picList = new ArrayList<>(); @@ -504,7 +506,8 @@ public static class Item { @Data @XStreamAlias("SendLocationInfo") - public static class SendLocationInfo { + public static class SendLocationInfo implements Serializable { + private static final long serialVersionUID = 6319921071637597406L; @XStreamAlias("Location_X") @XStreamConverter(value = XStreamCDataConverter.class) @@ -530,7 +533,8 @@ public static class SendLocationInfo { @XStreamAlias("ApprovalInfo") @Data - public static class ApprovalInfo { + public static class ApprovalInfo implements Serializable { + private static final long serialVersionUID = 8136329462880646091L; /** * 审批编号 @@ -551,7 +555,7 @@ public static class ApprovalInfo { /** * 审批模板id。 */ - @XStreamAlias("templateId") + @XStreamAlias("TemplateId") private String templateId; /** * 审批申请提交时间,Unix时间戳 @@ -563,18 +567,20 @@ public static class ApprovalInfo { * 申请人信息 */ @XStreamAlias("Applyer") - private Applyer applyer; + private Applier applier; /** * 审批申请单变化类型 */ @XStreamAlias("StatuChangeEvent") - private Integer statuChangeEvent; + private Integer statusChangeEvent; @XStreamAlias("Applyer") @Data - public static class Applyer { + public static class Applier implements Serializable { + private static final long serialVersionUID = -979255011922209018L; + @XStreamAlias("Applyer") - private String UserId; + private String userId; @XStreamAlias("Party") private String party; } From 6a27b838b67c96e01d8551fa545d637a49816484 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 26 Jul 2020 23:20:24 +0800 Subject: [PATCH 57/90] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=85=AC?= =?UTF-8?q?=E4=BC=97=E5=8F=B7=E5=92=8C=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=9A=84?= =?UTF-8?q?OCR=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E4=B8=BApost?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/api/impl/WxMaOcrServiceImpl.java | 12 ++++++------ .../weixin/mp/api/impl/WxMpOcrServiceImpl.java | 12 ++++++------ .../weixin/mp/api/impl/WxMpOcrServiceImplTest.java | 14 +++++++------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java index b7df6849e7..0bddb0ff64 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java @@ -43,7 +43,7 @@ public WxOcrIdCardResult idCard(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(IDCARD, imgUrl), null); + final String result = this.mainService.post(String.format(IDCARD, imgUrl), null); return WxOcrIdCardResult.fromJson(result); } @@ -62,7 +62,7 @@ public WxOcrBankCardResult bankCard(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(BANK_CARD, imgUrl), null); + final String result = this.mainService.post(String.format(BANK_CARD, imgUrl), null); return WxOcrBankCardResult.fromJson(result); } @@ -81,7 +81,7 @@ public WxOcrDrivingResult driving(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(DRIVING, imgUrl), null); + final String result = this.mainService.post(String.format(DRIVING, imgUrl), null); return WxOcrDrivingResult.fromJson(result); } @@ -100,7 +100,7 @@ public WxOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorExc // ignore cannot happen } - final String result = this.mainService.get(String.format(DRIVING_LICENSE, imgUrl), null); + final String result = this.mainService.post(String.format(DRIVING_LICENSE, imgUrl), null); return WxOcrDrivingLicenseResult.fromJson(result); } @@ -119,7 +119,7 @@ public WxOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(BIZ_LICENSE, imgUrl), null); + final String result = this.mainService.post(String.format(BIZ_LICENSE, imgUrl), null); return WxOcrBizLicenseResult.fromJson(result); } @@ -138,7 +138,7 @@ public WxOcrCommResult comm(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(COMM, imgUrl), null); + final String result = this.mainService.post(String.format(COMM, imgUrl), null); return WxOcrCommResult.fromJson(result); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java index 6b40c98226..6cd8cf1462 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java @@ -48,7 +48,7 @@ public WxOcrIdCardResult idCard(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(IDCARD.getUrl(this.mainService.getWxMpConfigStorage()), + final String result = this.mainService.post(String.format(IDCARD.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); return WxOcrIdCardResult.fromJson(result); } @@ -68,7 +68,7 @@ public WxOcrBankCardResult bankCard(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(BANK_CARD.getUrl(this.mainService.getWxMpConfigStorage()), + final String result = this.mainService.post(String.format(BANK_CARD.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); return WxOcrBankCardResult.fromJson(result); } @@ -88,7 +88,7 @@ public WxOcrDrivingResult driving(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(DRIVING.getUrl(this.mainService.getWxMpConfigStorage()), + final String result = this.mainService.post(String.format(DRIVING.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); return WxOcrDrivingResult.fromJson(result); } @@ -108,7 +108,7 @@ public WxOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorExc // ignore cannot happen } - final String result = this.mainService.get(String.format(DRIVING_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), + final String result = this.mainService.post(String.format(DRIVING_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); return WxOcrDrivingLicenseResult.fromJson(result); } @@ -128,7 +128,7 @@ public WxOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(BIZ_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), + final String result = this.mainService.post(String.format(BIZ_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); return WxOcrBizLicenseResult.fromJson(result); } @@ -148,7 +148,7 @@ public WxOcrCommResult comm(String imgUrl) throws WxErrorException { // ignore cannot happen } - final String result = this.mainService.get(String.format(COMM.getUrl(this.mainService.getWxMpConfigStorage()), + final String result = this.mainService.post(String.format(COMM.getUrl(this.mainService.getWxMpConfigStorage()), imgUrl), null); return WxOcrCommResult.fromJson(result); } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java index 5f71786681..b3f45eb8d8 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java @@ -153,13 +153,13 @@ private InputStream getImageStream(String url) { } public static class MockTest { - private WxMpService wxService = mock(WxMpService.class); + private final WxMpService wxService = mock(WxMpService.class); @Test public void testIdCard() throws Exception { String returnJson = "{\"type\":\"Back\",\"name\":\"张三\",\"id\":\"110101199909090099\",\"valid_date\":\"20110101-20210201\"}"; - when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + when(wxService.post(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); final WxOcrIdCardResult result = wxMpOcrService.idCard("abc"); @@ -171,7 +171,7 @@ public void testIdCard() throws Exception { public void testBankCard() throws Exception { String returnJson = "{\"number\":\"24234234345234\"}"; - when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + when(wxService.post(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); final WxOcrBankCardResult result = wxMpOcrService.bankCard("abc"); @@ -246,7 +246,7 @@ public void testDriving() throws Exception { " }\n" + "}"; - when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + when(wxService.post(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); final WxOcrDrivingResult result = wxMpOcrService.driving("abc"); @@ -271,7 +271,7 @@ public void testDrivingLicense() throws Exception { " \"valid_to\": \"2020-07-01\", //有效期限终止日\n" + " \"official_seal\": \"xx市公安局公安交通管理局\" //印章文字\n" + "}"; - when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + when(wxService.post(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); final WxOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc"); @@ -321,7 +321,7 @@ public void testBizLicense() throws Exception { " \"h\": 728\n" + " }\n" + "}"; - when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + when(wxService.post(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); final WxOcrBizLicenseResult result = wxMpOcrService.bizLicense("abc"); @@ -383,7 +383,7 @@ public void testComm() throws Exception { " \"h\": 720\n" + " }\n" + "}"; - when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + when(wxService.post(anyString(), anyString())).thenReturn(returnJson); final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService); final WxOcrCommResult result = wxMpOcrService.comm("abc"); From fa24f789ed5513f61b2563d42dddffa7f547cca4 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 26 Jul 2020 23:22:58 +0800 Subject: [PATCH 58/90] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=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 --- .../main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java index b32281df5e..85c6d99131 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java @@ -447,7 +447,8 @@ public String toString() { @Data @XStreamAlias("ScanCodeInfo") - public static class ScanCodeInfo { + public static class ScanCodeInfo implements Serializable { + private static final long serialVersionUID = 7420078330239763395L; /** * 扫描类型,一般是qrcode. From 7ef9e9153d7dfcb5f1d32995c9876c513eb7b98d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 26 Jul 2020 23:47:23 +0800 Subject: [PATCH 59/90] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=AD=97=E6=AE=B5=E5=80=BC=E8=A1=A8=E8=BE=BE=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/json/WxMpMassOpenIdsMessageGsonAdapter.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java index 562222fc67..10b1b72711 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java @@ -48,9 +48,16 @@ public JsonElement serialize(WxMpMassOpenIdsMessage message, Type typeOfSrc, Jso messageJson.add(WxConsts.MassMsgType.MPVIDEO, sub); } messageJson.addProperty("msgtype", message.getMsgType()); - messageJson.addProperty("send_ignore_reprint", message.isSendIgnoreReprint() ? 0 : 1); - if(StringUtils.isNotEmpty(message.getClientMsgId())){ + /* + 开发者可以对群发接口的 send_ignore_reprint 参数进行设置,指定待群发的文章被判定为转载时,是否继续群发。 + 当 send_ignore_reprint 参数设置为1时,文章被判定为转载时,且原创文允许转载时,将继续进行群发操作。 + 当 send_ignore_reprint 参数设置为0时,文章被判定为转载时,将停止群发操作。 + send_ignore_reprint 默认为0。 + */ + messageJson.addProperty("send_ignore_reprint", message.isSendIgnoreReprint() ? 1 : 0); + + if (StringUtils.isNotEmpty(message.getClientMsgId())) { messageJson.addProperty("clientmsgid", message.getClientMsgId()); } From 2755bc9d50005fe8c2dd0291b082e95f093600cb Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 27 Jul 2020 00:05:30 +0800 Subject: [PATCH 60/90] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=203.8.7.B?= =?UTF-8?q?=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 +- 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 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index a36f8a840c..7df2c1832f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.8.6.B + 3.8.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 03f9b421ac..818c3d3701 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.6.B + 3.8.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 d7f1605ef1..7b11311c7b 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.6.B + 3.8.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 499eade578..678a0b4559 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.6.B + 3.8.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 7b128332b3..f4ca866af1 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.6.B + 3.8.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 8645c4cbe7..d38ff651b7 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.6.B + 3.8.7.B 4.0.0 diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml index 23f9147b87..cc84e9a731 100644 --- a/weixin-graal/pom.xml +++ b/weixin-graal/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.6.B + 3.8.7.B weixin-graal diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 50f9db3357..cef4052c9f 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.6.B + 3.8.7.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 807d70b6b1..fafa157e2d 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.6.B + 3.8.7.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 8f9e51d77f..81a33f62e5 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.6.B + 3.8.7.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index c33fe51677..663b0490fa 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.6.B + 3.8.7.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 124b3a7350..14b7cd6df5 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.6.B + 3.8.7.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 90d0160290..70f8d89fde 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.8.6.B + 3.8.7.B 4.0.0 From a776e9cf11c0a776dc8748a7c37a169c1740f25d Mon Sep 17 00:00:00 2001 From: huangxm129 <40385667+huangxm129@users.noreply.github.com> Date: Fri, 31 Jul 2020 14:02:35 +0800 Subject: [PATCH 61/90] =?UTF-8?q?:art:=20=20#1690=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=A4=96=E9=83=A8=E8=81=94=E7=B3=BB=E4=BA=BA?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=87=A0=E4=B8=AA=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 外部联系人客户详情新增增加字段 增加字段:remark_corp_name,addWay,oper_userid Signed-off-by: huangxiaoming * 修改测试类 Signed-off-by: huangxiaoming * 客户标签组查询列表功能修改 Signed-off-by: huangxiaoming * 修改测试类 Signed-off-by: huangxiaoming * 修改 add_way字段错误 Signed-off-by: huangxiaoming --- pom.xml | 2 +- .../cp/api/WxCpExternalContactService.java | 4 +- .../impl/WxCpExternalContactServiceImpl.java | 8 +- .../cp/bean/WxCpUserExternalContactInfo.java | 6 ++ ...java => WxCpUserExternalTagGroupInfo.java} | 6 +- .../cp/bean/WxCpUserExternalTagGroupList.java | 75 +++++++++++++++++++ .../WxCpExternalContactServiceImplTest.java | 22 +++--- 7 files changed, 100 insertions(+), 23 deletions(-) rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{WxCpUserExternalTagGroup.java => WxCpUserExternalTagGroupInfo.java} (88%) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupList.java diff --git a/pom.xml b/pom.xml index 7df2c1832f..d1b8da28a5 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,7 @@ huangxiaoming - huangxiaoming@163.com + huangxm129@163.com https://github.com/huangxm129 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 e1806d0977..12d7944627 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 @@ -255,7 +255,7 @@ public interface WxCpExternalContactService { * @param tagId * @return */ - WxCpUserExternalTagGroup getCorpTagList(String [] tagId) throws WxErrorException; + WxCpUserExternalTagGroupList getCorpTagList(String [] tagId) throws WxErrorException; /** @@ -266,7 +266,7 @@ public interface WxCpExternalContactService { * @param tagGroup * @return */ - WxCpUserExternalTagGroup addCorpTag(WxCpUserExternalTagGroup tagGroup)throws WxErrorException; + WxCpUserExternalTagGroupInfo addCorpTag(WxCpUserExternalTagGroupInfo tagGroup)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 01477c8547..f9058f0179 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
@@ -225,22 +225,22 @@ public WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate)
   }
 
   @Override
-  public WxCpUserExternalTagGroup getCorpTagList(String[] tagId) throws WxErrorException {
+  public WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErrorException {
     JsonObject json = new JsonObject();
     if(ArrayUtils.isNotEmpty(tagId)){
       json.add("tag_id",new Gson().toJsonTree(tagId).getAsJsonArray());
     }
     final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CORP_TAG_LIST);
     final String result = this.mainService.post(url,json.toString());
-    return WxCpUserExternalTagGroup.fromJson(result);
+    return WxCpUserExternalTagGroupList.fromJson(result);
   }
 
   @Override
-  public WxCpUserExternalTagGroup addCorpTag(WxCpUserExternalTagGroup tagGroup) throws WxErrorException{
+  public WxCpUserExternalTagGroupInfo addCorpTag(WxCpUserExternalTagGroupInfo tagGroup) throws WxErrorException{
 
     final String url = this.mainService.getWxCpConfigStorage().getApiUrl(ADD_CORP_TAG);
     final String result = this.mainService.post(url,tagGroup.toJson());
-    return WxCpUserExternalTagGroup.fromJson(result);
+    return WxCpUserExternalTagGroupInfo.fromJson(result);
   }
 
   @Override
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfo.java
index d099e4eeb6..6e290ce063 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfo.java
@@ -119,6 +119,12 @@ public static class FollowedUser {
     @SerializedName("remark_mobiles")
     private String[] remarkMobiles;
     private Tag[] tags;
+    @SerializedName("remark_corp_name")
+    private String remarkCorpName;
+    @SerializedName("add_way")
+    private String addWay;
+    @SerializedName("oper_userid")
+    private String operUserId;
 
   }
 
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroup.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java
similarity index 88%
rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroup.java
rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java
index 1dff12057b..16d20d7eca 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroup.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java
@@ -13,7 +13,7 @@
  */
 @Getter
 @Setter
-public class WxCpUserExternalTagGroup extends WxCpBaseResp {
+public class WxCpUserExternalTagGroupInfo extends WxCpBaseResp {
 
   @SerializedName("group_id")
   private String groupId;
@@ -63,7 +63,7 @@ public String toJson() {
     return WxGsonBuilder.create().toJson(this);
   }
 
-  public static WxCpUserExternalTagGroup fromJson(String json) {
-    return WxCpGsonBuilder.create().fromJson(json, WxCpUserExternalTagGroup.class);
+  public static WxCpUserExternalTagGroupInfo fromJson(String json) {
+    return WxCpGsonBuilder.create().fromJson(json, WxCpUserExternalTagGroupInfo.class);
   }
 }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupList.java
new file mode 100644
index 0000000000..f77433cb4b
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupList.java
@@ -0,0 +1,75 @@
+package me.chanjar.weixin.cp.bean;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Getter;
+import lombok.Setter;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+import java.util.List;
+
+/**
+ *
+ */
+@Getter
+@Setter
+public class WxCpUserExternalTagGroupList extends WxCpBaseResp {
+
+  @SerializedName("tag_group")
+  private List tagGroupList;
+
+  @Getter
+  @Setter
+  public static class TagGroup{
+    @SerializedName("group_id")
+    private String groupId;
+
+    @SerializedName("group_name")
+    private String groupName;
+
+    @SerializedName("create_time")
+    private Long createTime;
+
+    @SerializedName("order")
+    private Integer order;
+
+    @SerializedName("deleted")
+    private Boolean deleted;
+
+
+    @SerializedName("tag")
+    private List tag;
+
+    @Getter
+    @Setter
+    public static class Tag {
+
+      /**
+       * 客户群ID
+       */
+      @SerializedName("id")
+      private String id;
+
+      @SerializedName("name")
+      private String name;
+
+      @SerializedName("create_time")
+      private Long  createTime;
+
+      @SerializedName("order")
+      private Integer  order;
+
+      @SerializedName("deleted")
+      private Boolean  deleted;
+
+    }
+  }
+
+  public String toJson() {
+    return WxGsonBuilder.create().toJson(this);
+  }
+
+  public static WxCpUserExternalTagGroupList fromJson(String json) {
+    return WxCpGsonBuilder.create().fromJson(json, WxCpUserExternalTagGroupList.class);
+  }
+}
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 f23108315e..2c63496f3f 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
@@ -5,10 +5,7 @@
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.cp.api.ApiTestModule;
 import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.WxCpBaseResp;
-import me.chanjar.weixin.cp.bean.WxCpContactWayInfo;
-import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo;
-import me.chanjar.weixin.cp.bean.WxCpUserExternalTagGroup;
+import me.chanjar.weixin.cp.bean.*;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
@@ -110,7 +107,7 @@ public void testGetContactDetail() throws WxErrorException {
   @Test
   public void testGetCorpTagList() throws WxErrorException {
     String tag[]={};
-    WxCpUserExternalTagGroup result = this.wxCpService.getExternalContactService().getCorpTagList(null);
+    WxCpUserExternalTagGroupList result = this.wxCpService.getExternalContactService().getCorpTagList(null);
     System.out.println(result);
     assertNotNull(result);
   }
@@ -118,19 +115,18 @@ public void testGetCorpTagList() throws WxErrorException {
   @Test
   public void testAddCorpTag() throws WxErrorException {
 
-    List list = new ArrayList<>();
-
-    WxCpUserExternalTagGroup.Tag  tag = new  WxCpUserExternalTagGroup.Tag();
-    tag.setName("测试标签1");
+    List list = new ArrayList<>();
+    WxCpUserExternalTagGroupInfo.Tag  tag = new  WxCpUserExternalTagGroupInfo.Tag();
+    tag.setName("测试标签2");
     tag.setOrder(1);
     list.add(tag);
 
-    WxCpUserExternalTagGroup tagGroup = new WxCpUserExternalTagGroup();
+    WxCpUserExternalTagGroupInfo tagGroup = new WxCpUserExternalTagGroupInfo();
     tagGroup.setGroupName("其他");
     tagGroup.setOrder(1);
     tagGroup.setTag(list);
 
-    WxCpUserExternalTagGroup result = this.wxCpService.getExternalContactService().addCorpTag(tagGroup);
+    WxCpUserExternalTagGroupInfo result = this.wxCpService.getExternalContactService().addCorpTag(tagGroup);
 
 
 
@@ -141,7 +137,7 @@ public void testAddCorpTag() throws WxErrorException {
   @Test
   public void testEditCorpTag() throws WxErrorException {
 
-    WxCpBaseResp result = this.wxCpService.getExternalContactService().editCorpTag("et2omCCwAArxYqGJQn4MNMS_zQKhIUfQ", "未知", 2);
+    WxCpBaseResp result = this.wxCpService.getExternalContactService().editCorpTag("et2omCCwAA6PtGsfeEOQMENl3Ub1FA6A", "未知6", 2);
 
     System.out.println(result);
     assertNotNull(result);
@@ -150,7 +146,7 @@ public void testEditCorpTag() throws WxErrorException {
   @Test
   public void testDelCorpTag() throws WxErrorException {
 
-    String tagId[] = {"et2omCCwAArxYqGJQn4MNMS_zQKhIUfQ"};
+    String tagId[] = {"et2omCCwAA6PtGsfeEOQMENl3Ub1FA6A"};
     String groupId[] = {};
 
     WxCpBaseResp result = this.wxCpService.getExternalContactService().delCorpTag(tagId,groupId);

From a9f9e30089f51d2342b6f46d7f2892b10a654dc5 Mon Sep 17 00:00:00 2001
From: huangxm129 <40385667+huangxm129@users.noreply.github.com>
Date: Thu, 6 Aug 2020 09:35:29 +0800
Subject: [PATCH 62/90] =?UTF-8?q?:bug:=20#1699=20=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=A8=A1=E5=9D=97=E4=BF=AE=E5=A4=8D=E6=B7=BB?=
 =?UTF-8?q?=E5=8A=A0=E4=BC=81=E4=B8=9A=E5=AE=A2=E6=88=B7=E6=A0=87=E7=AD=BE?=
 =?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* 外部联系人客户详情新增增加字段

增加字段:remark_corp_name,addWay,oper_userid

Signed-off-by: huangxiaoming 

* 修改测试类

Signed-off-by: huangxiaoming 

* 客户标签组查询列表功能修改

Signed-off-by: huangxiaoming 

* 修改测试类

Signed-off-by: huangxiaoming 

* 修改 add_way字段错误

Signed-off-by: huangxiaoming 

* 修改添加企业客户标签后无返回信息

Signed-off-by: huangxiaoming 

* 外部联系人客户详情新增增加字段

增加字段:remark_corp_name,addWay,oper_userid

Signed-off-by: huangxiaoming 

* 修改测试类

Signed-off-by: huangxiaoming 

* 修改测试类

Signed-off-by: huangxiaoming 

* 修改 add_way字段错误

Signed-off-by: huangxiaoming 

* 修改添加企业客户标签后无返回信息

Signed-off-by: huangxiaoming 

* 修改错误

Signed-off-by: huangxiaoming 

* 修改冲突

Signed-off-by: huangxiaoming 
---
 .../impl/WxCpExternalContactServiceImpl.java  |  4 +--
 .../cp/bean/WxCpUserExternalTagGroupInfo.java | 35 ++++++++++++-------
 .../WxCpExternalContactServiceImplTest.java   | 16 ++++-----
 3 files changed, 33 insertions(+), 22 deletions(-)

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 f9058f0179..b38c6b868c 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
@@ -239,7 +239,7 @@ public WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErro
   public WxCpUserExternalTagGroupInfo addCorpTag(WxCpUserExternalTagGroupInfo tagGroup) throws WxErrorException{
 
     final String url = this.mainService.getWxCpConfigStorage().getApiUrl(ADD_CORP_TAG);
-    final String result = this.mainService.post(url,tagGroup.toJson());
+    final String result = this.mainService.post(url,tagGroup.getTagGroup().toJson());
     return WxCpUserExternalTagGroupInfo.fromJson(result);
   }
 
@@ -262,7 +262,7 @@ public WxCpBaseResp delCorpTag(String[] tagId, String[] groupId) throws WxErrorE
       json.add("tag_id",new Gson().toJsonTree(tagId).getAsJsonArray());
     }
     if(ArrayUtils.isNotEmpty(groupId)){
-      json.add("group_id",new Gson().toJsonTree(tagId).getAsJsonArray());
+      json.add("group_id",new Gson().toJsonTree(groupId).getAsJsonArray());
     }
 
     final String url = this.mainService.getWxCpConfigStorage().getApiUrl(DEL_CORP_TAG);
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java
index 16d20d7eca..d0aa9fe327 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java
@@ -15,24 +15,35 @@
 @Setter
 public class WxCpUserExternalTagGroupInfo extends WxCpBaseResp {
 
-  @SerializedName("group_id")
-  private String groupId;
+  @SerializedName("tag_group")
+  private TagGroup tagGroup;
 
-  @SerializedName("group_name")
-  private String groupName;
+  @Getter
+  @Setter
+  public static class TagGroup {
+
+    @SerializedName("group_id")
+    private String groupId;
+
+    @SerializedName("group_name")
+    private String groupName;
 
-  @SerializedName("create_time")
-  private Long createTime;
+    @SerializedName("create_time")
+    private Long createTime;
 
-  @SerializedName("order")
-  private Integer order;
+    @SerializedName("order")
+    private Integer order;
 
-  @SerializedName("deleted")
-  private Boolean deleted;
+    @SerializedName("deleted")
+    private Boolean deleted;
 
+    @SerializedName("tag")
+    private List tag;
 
-  @SerializedName("tag")
-  private List tag;
+    public String toJson() {
+      return WxGsonBuilder.create().toJson(this);
+    }
+  }
 
   @Getter
   @Setter
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 2c63496f3f..df086037a5 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
@@ -117,20 +117,20 @@ public void testAddCorpTag() throws WxErrorException {
 
     List list = new ArrayList<>();
     WxCpUserExternalTagGroupInfo.Tag  tag = new  WxCpUserExternalTagGroupInfo.Tag();
-    tag.setName("测试标签2");
+    tag.setName("测试标签20");
     tag.setOrder(1);
     list.add(tag);
 
-    WxCpUserExternalTagGroupInfo tagGroup = new WxCpUserExternalTagGroupInfo();
+    WxCpUserExternalTagGroupInfo tagGroupInfo = new WxCpUserExternalTagGroupInfo();
+    WxCpUserExternalTagGroupInfo.TagGroup tagGroup = new WxCpUserExternalTagGroupInfo.TagGroup();
     tagGroup.setGroupName("其他");
     tagGroup.setOrder(1);
     tagGroup.setTag(list);
+    tagGroupInfo.setTagGroup(tagGroup);
 
-    WxCpUserExternalTagGroupInfo result = this.wxCpService.getExternalContactService().addCorpTag(tagGroup);
+    WxCpUserExternalTagGroupInfo result = this.wxCpService.getExternalContactService().addCorpTag(tagGroupInfo);
 
-
-
-    System.out.println(result);
+    System.out.println(result.toJson());
     assertNotNull(result);
   }
 
@@ -146,8 +146,8 @@ public void testEditCorpTag() throws WxErrorException {
   @Test
   public void testDelCorpTag() throws WxErrorException {
 
-    String tagId[] = {"et2omCCwAA6PtGsfeEOQMENl3Ub1FA6A"};
-    String groupId[] = {};
+    String tagId[] = {};
+    String groupId[] = {"et2omCCwAAM3WzL00QpK9xARab3HGkAg"};
 
     WxCpBaseResp result = this.wxCpService.getExternalContactService().delCorpTag(tagId,groupId);
 

From e7f2378f49079456f8abec5261f64aea3f7cfac4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8F=B6=E6=9E=AB?= <954649679@qq.com>
Date: Fri, 7 Aug 2020 13:50:07 +0800
Subject: [PATCH 63/90] =?UTF-8?q?:new:=20#1639=20=E5=BE=AE=E4=BF=A1?=
 =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=A2=9E=E5=8A=A0v3=E5=9B=BE=E7=89=87?=
 =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

1. 实现v3上传图片功能
文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/chapter3_1.shtml
2. 将接口获取到的证书保存到PayConfig中,v3接口中部分字段是敏感数据,在对这些数据加密时会用到
---
 .../wxpay/bean/media/ImageUploadResult.java   | 28 +++++++
 .../binarywang/wxpay/config/WxPayConfig.java  | 23 ++++--
 .../wxpay/service/MerchantMediaService.java   | 31 ++++++++
 .../wxpay/service/WxPayService.java           | 11 +++
 .../impl/MerchantMediaServiceImpl.java        | 44 +++++++++++
 .../impl/WxPayServiceApacheHttpImpl.java      | 30 ++++++++
 .../impl/WxPayServiceJoddHttpImpl.java        |  6 ++
 .../binarywang/wxpay/v3/Credentials.java      |  5 +-
 .../binarywang/wxpay/v3/SignatureExec.java    | 25 +++---
 .../wxpay/v3/WechatPayUploadHttpPost.java     | 76 +++++++++++++++++++
 .../auth/AutoUpdateCertificatesVerifier.java  | 16 +++-
 .../wxpay/v3/auth/CertificatesVerifier.java   | 20 +++++
 .../binarywang/wxpay/v3/auth/Verifier.java    |  5 ++
 .../wxpay/v3/auth/WxPayCredentials.java       | 26 ++++---
 .../impl/MerchantMediaServiceImplTest.java    | 54 +++++++++++++
 .../src/test/resources/test-config.sample.xml |  8 ++
 16 files changed, 376 insertions(+), 32 deletions(-)
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/ImageUploadResult.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MerchantMediaService.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImpl.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/WechatPayUploadHttpPost.java
 create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImplTest.java

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/ImageUploadResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/ImageUploadResult.java
new file mode 100644
index 0000000000..8b7f53a2bf
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/ImageUploadResult.java
@@ -0,0 +1,28 @@
+package com.github.binarywang.wxpay.bean.media;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+/**
+ * 媒体文件上传返回结果对象
+ * @author zhouyongshen
+ */
+@NoArgsConstructor
+@Data
+public class ImageUploadResult {
+
+  public static ImageUploadResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, ImageUploadResult.class);
+  }
+  /**
+   * 媒体文件标识 Id
+   *
+   * 微信返回的媒体文件标识Id。
+   * 示例值:6uqyGjGrCf2GtyXP8bxrbuH9-aAoTjH-rKeSl3Lf4_So6kdkQu4w8BYVP3bzLtvR38lxt4PjtCDXsQpzqge_hQEovHzOhsLleGFQVRF-U_0
+   *
+   */
+  @SerializedName("media_id")
+  private String mediaId;
+}
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 6d9bebdc6d..4ee1ed7075 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
@@ -2,10 +2,7 @@
 
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.v3.WxPayV3HttpClientBuilder;
-import com.github.binarywang.wxpay.v3.auth.AutoUpdateCertificatesVerifier;
-import com.github.binarywang.wxpay.v3.auth.PrivateKeySigner;
-import com.github.binarywang.wxpay.v3.auth.WxPayCredentials;
-import com.github.binarywang.wxpay.v3.auth.WxPayValidator;
+import com.github.binarywang.wxpay.v3.auth.*;
 import com.github.binarywang.wxpay.v3.util.PemUtils;
 import jodd.util.ResourcesUtil;
 import lombok.Data;
@@ -153,6 +150,12 @@ public class WxPayConfig {
   private String httpProxyUsername;
   private String httpProxyPassword;
 
+  /**
+   * v3接口下证书检验对象,通过改对象可以获取到X509Certificate,进一步对敏感信息加密
+   * 文档见 https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/min-gan-xin-xi-jia-mi
+   */
+  private Verifier verifier;
+
   /**
    * 返回所设置的微信支付接口请求地址域名.
    *
@@ -297,14 +300,20 @@ public CloseableHttpClient initApiV3HttpClient() throws WxPayException {
 
     try {
       PrivateKey merchantPrivateKey = PemUtils.loadPrivateKey(keyInputStream);
+
+      AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
+        new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)),
+        apiV3Key.getBytes(StandardCharsets.UTF_8));
+
+
       CloseableHttpClient httpClient = WxPayV3HttpClientBuilder.create()
         .withMerchant(mchId, certSerialNo, merchantPrivateKey)
         .withWechatpay(Collections.singletonList(PemUtils.loadCertificate(certInputStream)))
-        .withValidator(new WxPayValidator(new AutoUpdateCertificatesVerifier(
-          new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)),
-          apiV3Key.getBytes(StandardCharsets.UTF_8))))
+        .withValidator(new WxPayValidator(verifier))
         .build();
       this.apiV3HttpClient = httpClient;
+      this.verifier=verifier;
+
       return httpClient;
     } catch (Exception e) {
       throw new WxPayException("v3请求构造异常!", e);
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MerchantMediaService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MerchantMediaService.java
new file mode 100644
index 0000000000..429ece394d
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MerchantMediaService.java
@@ -0,0 +1,31 @@
+package com.github.binarywang.wxpay.service;
+
+import com.github.binarywang.wxpay.bean.media.ImageUploadResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * 
+ * 微信支付通用媒体接口.
+ * 
+ * + * @author zhouyongshen + */ +public interface MerchantMediaService { + /** + *
+   * 通用接口-图片上传API
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/chapter3_1.shtml
+   * 接口链接:https://api.mch.weixin.qq.com/v3/merchant/media/upload
+   * 
+ * + * @param imageFile 需要上传的图片文件 + * @return ImageUploadResult 微信返回的媒体文件标识Id。示例值:6uqyGjGrCf2GtyXP8bxrbuH9-aAoTjH-rKeSl3Lf4_So6kdkQu4w8BYVP3bzLtvR38lxt4PjtCDXsQpzqge_hQEovHzOhsLleGFQVRF-U_0 + * @throws WxPayException the wx pay exception + */ + ImageUploadResult imageUploadV3(File imageFile) throws WxPayException, IOException; + + +} 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 b29f50129c..565db9c6a9 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 @@ -10,6 +10,7 @@ import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; +import org.apache.http.client.methods.HttpPost; import java.io.File; import java.net.URI; @@ -65,6 +66,16 @@ public interface WxPayService { */ String postV3(String url, String requestStr) throws WxPayException; + /** + * 发送post请求,得到响应字符串. + * + * @param url 请求地址 + * @param httpPost 请求信息 + * @return 返回请求结果字符串 string + * @throws WxPayException the wx pay exception + */ + String postV3(String url, HttpPost httpPost) throws WxPayException; + /** * 发送get V3请求,得到响应字符串. * diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImpl.java new file mode 100644 index 0000000000..863b706a28 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImpl.java @@ -0,0 +1,44 @@ +package com.github.binarywang.wxpay.service.impl; + +import com.github.binarywang.wxpay.bean.media.ImageUploadResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.MerchantMediaService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; + +/** + * 微信支付-媒体文件上传service + * @author zhouyongshen + */ +@Slf4j +@RequiredArgsConstructor +public class MerchantMediaServiceImpl implements MerchantMediaService { + + private final WxPayService payService; + + @Override + public ImageUploadResult imageUploadV3(File imageFile) throws WxPayException,IOException { + String url = String.format("%s/v3/merchant/media/upload", this.payService.getPayBaseUrl()); + + try (FileInputStream s1 = new FileInputStream(imageFile)) { + String sha256 = DigestUtils.sha256Hex(s1); + try (InputStream s2 = new FileInputStream(imageFile)) { + WechatPayUploadHttpPost request = new WechatPayUploadHttpPost.Builder(URI.create(url)) + .withImage(imageFile.getName(), sha256, s2) + .build(); + String result = this.payService.postV3(url, request); + return ImageUploadResult.fromJson(result); + } + } + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java index 951451a1dd..7c4f2021a1 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java @@ -116,6 +116,36 @@ public String postV3(String url, String requestStr) throws WxPayException { } + @Override + public String postV3(String url, HttpPost httpPost) throws WxPayException { + + httpPost.setConfig(RequestConfig.custom() + .setConnectionRequestTimeout(this.getConfig().getHttpConnectionTimeout()) + .setConnectTimeout(this.getConfig().getHttpConnectionTimeout()) + .setSocketTimeout(this.getConfig().getHttpTimeout()) + .build()); + + CloseableHttpClient httpClient = this.createApiV3HttpClient(); + try (CloseableHttpResponse response = httpClient.execute(httpPost)) { + //v3已经改为通过状态码判断200 204 成功 + int statusCode = response.getStatusLine().getStatusCode(); + String responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); + if (HttpStatus.SC_OK == statusCode || HttpStatus.SC_NO_CONTENT == statusCode) { + this.log.info("\n【请求地址】:{}\n【响应数据】:{}", url, responseString); + return responseString; + } else { + //有错误提示信息返回 + JsonObject jsonObject = GsonParser.parse(responseString); + throw new WxPayException(jsonObject.get("message").getAsString()); + } + } catch (Exception e) { + this.log.error("\n【请求地址】:{}\n【异常信息】:{}", url, e.getMessage()); + throw new WxPayException(e.getMessage(), e); + } finally { + httpPost.releaseConnection(); + } + } + @Override public String getV3(URI url) throws WxPayException { CloseableHttpClient httpClient = this.createApiV3HttpClient(); diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java index b37160f90f..91292e8101 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java @@ -16,6 +16,7 @@ import jodd.http.net.SSLSocketHttpConnectionProvider; import jodd.http.net.SocketHttpConnectionProvider; import jodd.util.Base64; +import org.apache.http.client.methods.HttpPost; /** * 微信支付请求实现类,jodd-http实现. @@ -65,6 +66,11 @@ public String postV3(String url, String requestStr) throws WxPayException { return null; } + @Override + public String postV3(String url, HttpPost httpPost) throws WxPayException { + return null; + } + @Override public String getV3(URI url) throws WxPayException { return null; diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/Credentials.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/Credentials.java index d5102d1fa9..495e883f5a 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/Credentials.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/Credentials.java @@ -1,11 +1,12 @@ package com.github.binarywang.wxpay.v3; import java.io.IOException; -import org.apache.http.client.methods.HttpUriRequest; + +import org.apache.http.client.methods.HttpRequestWrapper; public interface Credentials { String getSchema(); - String getToken(HttpUriRequest request) throws IOException; + String getToken(HttpRequestWrapper request) throws IOException; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/SignatureExec.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/SignatureExec.java index a28dfdcd63..2345e3c68b 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/SignatureExec.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/SignatureExec.java @@ -2,6 +2,7 @@ import java.io.IOException; import org.apache.http.HttpEntity; +import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.StatusLine; import org.apache.http.client.methods.CloseableHttpResponse; @@ -12,6 +13,7 @@ import org.apache.http.client.methods.RequestBuilder; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.conn.routing.HttpRoute; +import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.execchain.ClientExecChain; import org.apache.http.util.EntityUtils; @@ -43,11 +45,11 @@ protected void convertToRepeatableResponseEntity(CloseableHttpResponse response) } } - protected void convertToRepeatableRequestEntity(HttpUriRequest request) throws IOException { - if (request instanceof HttpEntityEnclosingRequestBase) { - HttpEntity entity = ((HttpEntityEnclosingRequestBase) request).getEntity(); - if (entity != null && !entity.isRepeatable()) { - ((HttpEntityEnclosingRequestBase) request).setEntity(newRepeatableEntity(entity)); + protected void convertToRepeatableRequestEntity(HttpRequestWrapper request) throws IOException { + if (request instanceof HttpEntityEnclosingRequest) { + HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); + if (entity != null) { + ((HttpEntityEnclosingRequest) request).setEntity(new BufferedHttpEntity(entity)); } } } @@ -64,15 +66,16 @@ public CloseableHttpResponse execute(HttpRoute route, HttpRequestWrapper request private CloseableHttpResponse executeWithSignature(HttpRoute route, HttpRequestWrapper request, HttpClientContext context, HttpExecutionAware execAware) throws IOException, HttpException { - HttpUriRequest newRequest = RequestBuilder.copy(request.getOriginal()).build(); - convertToRepeatableRequestEntity(newRequest); + // 上传类不需要消耗两次故不做转换 + if (!(request.getOriginal() instanceof WechatPayUploadHttpPost)) { + convertToRepeatableRequestEntity(request); + } // 添加认证信息 - newRequest.addHeader("Authorization", - credentials.getSchema() + " " + credentials.getToken(newRequest)); + request.addHeader("Authorization", + credentials.getSchema() + " " + credentials.getToken(request)); // 执行 - CloseableHttpResponse response = mainExec.execute( - route, HttpRequestWrapper.wrap(newRequest), context, execAware); + CloseableHttpResponse response = mainExec.execute(route, request, context, execAware); // 对成功应答验签 StatusLine statusLine = response.getStatusLine(); diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/WechatPayUploadHttpPost.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/WechatPayUploadHttpPost.java new file mode 100644 index 0000000000..df0ee4e2fb --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/WechatPayUploadHttpPost.java @@ -0,0 +1,76 @@ +package com.github.binarywang.wxpay.v3; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; + +import java.io.InputStream; +import java.net.URI; +import java.net.URLConnection; + +public class WechatPayUploadHttpPost extends HttpPost { + + private String meta; + + private WechatPayUploadHttpPost(URI uri, String meta) { + super(uri); + + this.meta = meta; + } + + public String getMeta() { + return meta; + } + + public static class Builder { + + private String fileName; + private String fileSha256; + private InputStream fileInputStream; + private ContentType fileContentType; + private URI uri; + + public Builder(URI uri) { + this.uri = uri; + } + + public Builder withImage(String fileName, String fileSha256, InputStream inputStream) { + this.fileName = fileName; + this.fileSha256 = fileSha256; + this.fileInputStream = inputStream; + + String mimeType = URLConnection.guessContentTypeFromName(fileName); + if (mimeType == null) { + // guess this is a video uploading + this.fileContentType = ContentType.APPLICATION_OCTET_STREAM; + } else { + this.fileContentType = ContentType.create(mimeType); + } + return this; + } + + public WechatPayUploadHttpPost build() { + if (fileName == null || fileSha256 == null || fileInputStream == null) { + throw new IllegalArgumentException("缺少待上传图片文件信息"); + } + + if (uri == null) { + throw new IllegalArgumentException("缺少上传图片接口URL"); + } + + String meta = String.format("{\"filename\":\"%s\",\"sha256\":\"%s\"}", fileName, fileSha256); + WechatPayUploadHttpPost request = new WechatPayUploadHttpPost(uri, meta); + + MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); + entityBuilder.setMode(HttpMultipartMode.RFC6532) + .addBinaryBody("file", fileInputStream, fileContentType, fileName) + .addTextBody("meta", meta, ContentType.APPLICATION_JSON); + + request.setEntity(entityBuilder.build()); + request.addHeader("Accept", ContentType.APPLICATION_JSON.toString()); + + return request; + } + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifier.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifier.java index db656f4c94..a490108146 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifier.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifier.java @@ -100,6 +100,14 @@ public AutoUpdateCertificatesVerifier(Credentials credentials, byte[] apiV3Key, @Override public boolean verify(String serialNumber, byte[] message, String signature) { + checkAndAutoUpdateCert(); + return verifier.verify(serialNumber, message, signature); + } + + /** + * 检查证书是否在有效期内,如果不在有效期内则进行更新 + */ + private void checkAndAutoUpdateCert() { if (instant == null || Minutes.minutesBetween(instant, Instant.now()).getMinutes() >= minutesInterval) { if (lock.tryLock()) { try { @@ -113,7 +121,6 @@ public boolean verify(String serialNumber, byte[] message, String signature) { } } } - return verifier.verify(serialNumber, message, signature); } private void autoUpdateCert() throws IOException, GeneralSecurityException { @@ -179,4 +186,11 @@ private List deserializeToCerts(byte[] apiV3Key, String body) t return newCertList; } + + @Override + public X509Certificate getValidCertificate() { + checkAndAutoUpdateCert(); + return verifier.getValidCertificate(); + } + } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/CertificatesVerifier.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/CertificatesVerifier.java index 9853cf2eef..7239d9e64d 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/CertificatesVerifier.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/CertificatesVerifier.java @@ -5,10 +5,13 @@ import java.security.NoSuchAlgorithmException; import java.security.Signature; import java.security.SignatureException; +import java.security.cert.CertificateExpiredException; +import java.security.cert.CertificateNotYetValidException; import java.security.cert.X509Certificate; import java.util.Base64; import java.util.HashMap; import java.util.List; +import java.util.NoSuchElementException; public class CertificatesVerifier implements Verifier { private final HashMap certificates = new HashMap<>(); @@ -40,4 +43,21 @@ public boolean verify(String serialNumber, byte[] message, String signature) { BigInteger val = new BigInteger(serialNumber, 16); return certificates.containsKey(val) && verify(certificates.get(val), message, signature); } + + + @Override + public X509Certificate getValidCertificate() { + for (X509Certificate x509Cert : certificates.values()) { + try { + x509Cert.checkValidity(); + + return x509Cert; + } catch (CertificateExpiredException | CertificateNotYetValidException e) { + continue; + } + } + + throw new NoSuchElementException("没有有效的微信支付平台证书"); + } + } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/Verifier.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/Verifier.java index ed591a4ef2..49f92e2f5b 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/Verifier.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/Verifier.java @@ -1,5 +1,10 @@ package com.github.binarywang.wxpay.v3.auth; +import java.security.cert.X509Certificate; + public interface Verifier { boolean verify(String serialNumber, byte[] message, String signature); + + + X509Certificate getValidCertificate(); } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java index 9fca14e644..80eea8f686 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java @@ -1,16 +1,18 @@ package com.github.binarywang.wxpay.v3.auth; -import java.io.IOException; -import java.net.URI; -import java.security.SecureRandom; - import com.github.binarywang.wxpay.v3.Credentials; +import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost; import lombok.extern.slf4j.Slf4j; -import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; -import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.HttpEntityEnclosingRequest; +import org.apache.http.client.methods.HttpRequestWrapper; import org.apache.http.util.EntityUtils; +import java.io.IOException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; + @Slf4j public class WxPayCredentials implements Credentials { private static final String SYMBOLS = @@ -46,14 +48,14 @@ public final String getSchema() { } @Override - public final String getToken(HttpUriRequest request) throws IOException { + public final String getToken(HttpRequestWrapper request) throws IOException { String nonceStr = generateNonceStr(); long timestamp = generateTimestamp(); String message = buildMessage(nonceStr, timestamp, request); log.debug("authorization message=[{}]", message); - Signer.SignatureResult signature = signer.sign(message.getBytes("utf-8")); + Signer.SignatureResult signature = signer.sign(message.getBytes(StandardCharsets.UTF_8)); String token = "mchid=\"" + getMerchantId() + "\"," + "nonce_str=\"" + nonceStr + "\"," @@ -65,7 +67,7 @@ public final String getToken(HttpUriRequest request) throws IOException { return token; } - protected final String buildMessage(String nonce, long timestamp, HttpUriRequest request) + protected final String buildMessage(String nonce, long timestamp, HttpRequestWrapper request) throws IOException { URI uri = request.getURI(); String canonicalUrl = uri.getRawPath(); @@ -75,8 +77,10 @@ protected final String buildMessage(String nonce, long timestamp, HttpUriRequest String body = ""; // PATCH,POST,PUT - if (request instanceof HttpEntityEnclosingRequestBase) { - body = EntityUtils.toString(((HttpEntityEnclosingRequestBase) request).getEntity()); + if (request.getOriginal() instanceof WechatPayUploadHttpPost) { + body = ((WechatPayUploadHttpPost) request.getOriginal()).getMeta(); + } else if (request instanceof HttpEntityEnclosingRequest) { + body = EntityUtils.toString(((HttpEntityEnclosingRequest) request).getEntity()); } return request.getRequestLine().getMethod() + "\n" diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImplTest.java new file mode 100644 index 0000000000..c8dd069b44 --- /dev/null +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImplTest.java @@ -0,0 +1,54 @@ +package com.github.binarywang.wxpay.service.impl; + +import com.github.binarywang.wxpay.bean.media.ImageUploadResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.MerchantMediaService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.testbase.ApiTestModule; +import com.google.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; + +/** + *
+ *  媒体文件上传测试类
+ * 
+ * + * @author zhouyongshen + */ +@Slf4j +@Test +@Guice(modules = ApiTestModule.class) +public class MerchantMediaServiceImplTest { + + @Inject + private WxPayService wxPayService; + + @Test + public void testImageUploadV3() throws WxPayException, IOException { + + MerchantMediaService merchantMediaService=new MerchantMediaServiceImpl(wxPayService); + + String filePath="你的图片文件的路径地址"; +// String filePath="WxJava/images/banners/wiki.jpg"; + + File file=new File(filePath); + + ImageUploadResult imageUploadResult = merchantMediaService.imageUploadV3(file); + String mediaId = imageUploadResult.getMediaId(); + + log.info("mediaId1:[{}]",mediaId); + + File file2=new File(filePath); + + ImageUploadResult imageUploadResult2 = merchantMediaService.imageUploadV3(file2); + String mediaId2 = imageUploadResult2.getMediaId(); + + log.info("mediaId2:[{}]",mediaId2); + + } +} diff --git a/weixin-java-pay/src/test/resources/test-config.sample.xml b/weixin-java-pay/src/test/resources/test-config.sample.xml index 1e64cbe40c..25ec4be056 100644 --- a/weixin-java-pay/src/test/resources/test-config.sample.xml +++ b/weixin-java-pay/src/test/resources/test-config.sample.xml @@ -10,4 +10,12 @@ --> 商户平台的证书文件地址 某个openId + + From edf8e18c5be3d0f170e478de98fd7da186a714a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E6=9E=AB?= <954649679@qq.com> Date: Fri, 7 Aug 2020 17:39:38 +0800 Subject: [PATCH 64/90] =?UTF-8?q?=20:new:=20#1706=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=A2=9E=E5=8A=A0=E7=89=B9=E7=BA=A6=E5=95=86?= =?UTF-8?q?=E6=88=B7=E8=BF=9B=E4=BB=B6=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 * 实现特约商户进件相关接口 --- .../applyment/ApplymentStateQueryResult.java | 87 ++ .../applyment/ModifySettlementRequest.java | 53 ++ .../bean/applyment/SettlementInfoResult.java | 51 + .../WxPayApplyment4SubCreateRequest.java | 883 ++++++++++++++++++ .../applyment/WxPayApplymentCreateResult.java | 31 + .../bean/applyment/enums/AccountTypeEnum.java | 18 + .../applyment/enums/ApplymentStateEnum.java | 42 + .../applyment/enums/BankAccountTypeEnum.java | 18 + .../bean/applyment/enums/CertTypeEnum.java | 60 ++ .../bean/applyment/enums/IdTypeEnum.java | 29 + .../applyment/enums/SalesScenesTypeEnum.java | 32 + .../enums/SettlementVerifyResultEnum.java | 23 + .../bean/applyment/enums/SubjectTypeEnum.java | 28 + .../binarywang/wxpay/config/WxPayConfig.java | 10 + .../wxpay/service/Applyment4SubService.java | 67 ++ .../wxpay/service/WxPayService.java | 12 + .../impl/Applyment4SubServiceImpl.java | 68 ++ .../impl/WxPayServiceApacheHttpImpl.java | 36 + .../impl/WxPayServiceJoddHttpImpl.java | 5 + .../binarywang/wxpay/v3/SpecEncrypt.java | 16 + .../wxpay/v3/util/RsaCryptoUtil.java | 99 ++ .../impl/Applyment4SubServiceImplTest.java | 87 ++ 22 files changed, 1755 insertions(+) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImpl.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/SpecEncrypt.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImplTest.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java new file mode 100644 index 0000000000..41954a2aa9 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java @@ -0,0 +1,87 @@ +package com.github.binarywang.wxpay.bean.applyment; + +import com.github.binarywang.wxpay.bean.applyment.enums.ApplymentStateEnum; +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 查询申请单状态返回对象信息 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class ApplymentStateQueryResult { + + /** + * 业务申请编号 + */ + @SerializedName("business_code") + private String businessCode; + /** + * 微信支付申请单号 + */ + @SerializedName("applyment_id") + private String applymentId; + /** + * 特约商户号 + */ + @SerializedName("sub_mchid") + private String subMchid; + /** + * 超级管理员签约链接 + */ + @SerializedName("sign_url") + private String signUrl; + + /** + * 申请单状态 + * + */ + @SerializedName("applyment_state") + private ApplymentStateEnum applymentState; + /** + * 申请状态描述 + */ + @SerializedName("applyment_state_msg") + private String applymentStateMsg; + /** + * 驳回原因详情 + */ + @SerializedName("audit_detail") + private List auditDetail; + + /** + * 驳回原因详情 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AuditDetail { + /** + * 字段名 + */ + @SerializedName("field") + private String field; + /** + * 字段名称 + */ + @SerializedName("field_name") + private String fieldName; + /** + * 驳回原因 + */ + @SerializedName("reject_reason") + private String rejectReason; + + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java new file mode 100644 index 0000000000..e31af2aed7 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java @@ -0,0 +1,53 @@ +package com.github.binarywang.wxpay.bean.applyment; + +import com.github.binarywang.wxpay.bean.applyment.enums.AccountTypeEnum; +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import com.github.binarywang.wxpay.v3.SpecEncrypt; + +/** + * 修改结算账户请求对象 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class ModifySettlementRequest { + /** + *账户类型 + */ + @SerializedName("account_type") + private AccountTypeEnum accountType; + /** + *开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + *开户银行省市编码 + */ + @SerializedName("bank_address_code") + private String bankAddressCode; + /** + *开户银行全称(含支行) + */ + @SerializedName("bank_name") + private String bankName; + /** + *开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + + /** + *银行账号 + */ + @SpecEncrypt + @SerializedName("account_number") + private String accountNumber; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java new file mode 100644 index 0000000000..b284f7926a --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java @@ -0,0 +1,51 @@ +package com.github.binarywang.wxpay.bean.applyment; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 查询结算账户返回对象信息 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class SettlementInfoResult { + + /** + * 账户类型 + */ + @SerializedName("account_type") + private String accountType; + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + * 开户银行全称(含支行] + */ + @SerializedName("bank_name") + private String bankName; + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + /** + * 银行账号 + */ + @SerializedName("account_number") + private String accountNumber; + /** + * 汇款验证结果 + * @see com.github.binarywang.wxpay.bean.applyment.enums.SettlementVerifyResultEnum + */ + @SerializedName("verify_result") + private String verifyResult; +} 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 new file mode 100644 index 0000000000..cfdbdd8ed8 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java @@ -0,0 +1,883 @@ +package com.github.binarywang.wxpay.bean.applyment; + +import com.github.binarywang.wxpay.bean.applyment.enums.*; +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import com.github.binarywang.wxpay.v3.SpecEncrypt; + +import java.io.Serializable; +import java.util.List; + +/** + * 特约商户进件 提交申请对象 + * + * @author zhouyongshen + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class WxPayApplyment4SubCreateRequest implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 业务申请编号 + */ + @SerializedName("business_code") + private String businessCode; + /** + * 超级管理员信息 + */ + @SerializedName("contact_info") + @SpecEncrypt + private ContactInfo contactInfo; + + /** + * 主体资料 + */ + @SerializedName("subject_info") + @SpecEncrypt + private SubjectInfo subjectInfo; + + /** + * 经营资料 + */ + @SerializedName("business_info") + private BusinessInfo businessInfo; + + /** + * 结算规则 + */ + @SerializedName("settlement_info") + private SettlementInfo settlementInfo; + + /** + * 结算银行账户 + */ + @SerializedName("bank_account_info") + @SpecEncrypt + private BankAccountInfo bankAccountInfo; + + /** + * 结算银行账户 + */ + @SerializedName("addition_info") + private AdditionInfo additionInfo; + + /** + * 超级管理员需在开户后进行签约,并接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class ContactInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 超级管理员姓名 + */ + @SerializedName("contact_name") + @SpecEncrypt + private String contactName; + + /** + * 超级管理员身份证件号码 + * 1、“超级管理员身份证号码”与“超级管理员微信openid”,二选一必填。 + * 2、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。 + * 3、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。 + */ + @SerializedName("contact_id_number") + @SpecEncrypt + private String contactIdNumber; + + /** + * 超级管理员微信openid + * 1、“超级管理员身份证件号码”与“超级管理员微信openid”,二选一必填。 + * 2、超级管理员签约时,校验微信号是否与该微信openid一致。 + */ + @SerializedName("openid") + private String openid; + + /** + * 1、11位数字。 + * 2、用于接收微信支付的重要管理信息及日常操作验证码。 + */ + @SerializedName("mobile_phone") + @SpecEncrypt + private String mobilePhone; + + /** + * 1、用于接收微信支付的开户邮件及日常业务通知。 + * 2、需要带@,遵循邮箱格式校验,该字段需进行加密处理, + */ + @SerializedName("contact_email") + @SpecEncrypt + private String contactEmail; + + } + + /** + * 主体资料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SubjectInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主体类型 + */ + @SerializedName("subject_type") + private SubjectTypeEnum subjectType; + + /** + * 营业执照 + */ + @SerializedName("business_license_info") + private BusinessLicenseInfo businessLicenseInfo; + /** + * 登记证书 + */ + @SerializedName("certificate_info") + private CertificateInfo certificateInfo; + + /** + * 组织机构代码证 + */ + @SerializedName("organization_info") + private OrganizationInfo organizationInfo; + + /** + * 单位证明函照片 + */ + @SerializedName("certificate_letter_copy") + private String certificateLetterCopy; + + /** + * 经营者/法人身份证件 + */ + @SerializedName("identity_info") + @SpecEncrypt + private IdentityInfo identityInfo; + + /** + * 最终受益人信息(UBO] + */ + @SerializedName("ubo_info") + @SpecEncrypt + private UboInfo uboInfo; + + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BusinessLicenseInfo { + /** + * 营业执照照片 + */ + @SerializedName("license_copy") + private String licenseCopy; + /** + * 注册号/统一社会信用代码 + */ + @SerializedName("license_number") + private String licenseNumber; + /** + * 商户名称 + */ + @SerializedName("merchant_name") + private String merchantName; + /** + * 个体户经营者/法人姓名 + */ + @SerializedName("legal_person") + private String legalPerson; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class CertificateInfo { + + /** + * 登记证书照片 + */ + @SerializedName("cert_copy") + private String certCopy; + + /** + * 登记证书类型 + */ + @SerializedName("cert_type") + private CertTypeEnum certType; + + + /** + * 证书号 + */ + @SerializedName("cert_number") + private String certNumber; + + + /** + * 商户名称 + */ + @SerializedName("merchant_name") + private String merchantName; + + + /** + * 注册地址 + */ + @SerializedName("company_address") + private String companyAddress; + + + /** + * 法人姓名 + */ + @SerializedName("legal_person") + private String legalPerson; + + + /** + * 有效期限开始日期 + */ + @SerializedName("period_begin") + private String periodBegin; + + + /** + * 有效期限结束日期 + */ + @SerializedName("period_end") + private String periodEnd; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class OrganizationInfo { + /** + * 组织机构代码证照片 + */ + @SerializedName("organization_copy") + private String organizationCopy; + /** + * 组织机构代码 + */ + @SerializedName("organization_code") + private String organizationCode; + /** + * 组织机构代码证有效期开始日期 + */ + @SerializedName("org_period_begin") + private String orgPeriodBegin; + /** + * 组织机构代码证有效期结束日期 + */ + @SerializedName("org_period_end") + private String orgPeriodEnd; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdentityInfo { + + /** + * 证件类型 + */ + @SerializedName("id_doc_type") + private IdTypeEnum idDocType; + + /** + * 身份证信息 + */ + @SerializedName("id_card_info") + @SpecEncrypt + private IdCardInfo idCardInfo; + + /** + * 其他类型证件信息 + */ + @SerializedName("id_doc_info") + @SpecEncrypt + private IdDocInfo idDocInfo; + + /** + * 经营者/法人是否为受益人 + */ + @SerializedName("owner") + private boolean owner; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdCardInfo { + /** + * 身份证人像面照片 + */ + @SerializedName("id_card_copy") + private String idCardCopy; + /** + * 身份证国徽面照片 + */ + @SerializedName("id_card_national") + private String idCardNational; + + /** + * 身份证姓名 + */ + @SerializedName("id_card_name") + @SpecEncrypt + private String idCardName; + /** + * 身份证号码 + */ + @SerializedName("id_card_number") + @SpecEncrypt + private String idCardNumber; + /** + * 身份证有效期开始时间 + */ + @SerializedName("card_period_begin") + private String cardPeriodBegin; + /** + * 身份证有效期结束时间 + */ + @SerializedName("card_period_end") + private String cardPeriodEnd; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdDocInfo { + /** + * 证件照片 + */ + @SerializedName("id_doc_copy") + private String idDocCopy; + + /** + * 证件姓名 + */ + @SerializedName("id_doc_name") + @SpecEncrypt + private String idDocName; + + /** + * 证件号码 + */ + @SerializedName("id_doc_number") + @SpecEncrypt + private String idDocNumber; + /** + * 证件有效期开始时间 + */ + @SerializedName("doc_period_begin") + private String docPeriodBegin; + /** + * 证件有效期结束时间 + */ + @SerializedName("doc_period_end") + private String docPeriodEnd; + } + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class UboInfo { + /** + * 证件类型 + */ + @SerializedName("id_type") + private IdTypeEnum idType; + /** + * 身份证人像面照片 + */ + @SerializedName("id_card_copy") + private String idCardCopy; + /** + * 身份证国徽面照片 + */ + @SerializedName("id_card_national") + private String idCardNational; + /** + * 证件照片 + */ + @SerializedName("id_doc_copy") + private String idDocCopy; + /** + * 受益人姓名 + */ + @SerializedName("name") + @SpecEncrypt + private String name; + /** + * 证件号码 + */ + @SerializedName("id_number") + @SpecEncrypt + private String idNumber; + /** + * 证件有效期开始时间 + */ + @SerializedName("id_period_begin") + private String idPeriodBegin; + /** + * 证件有效期结束时间 + */ + @SerializedName("id_period_end") + private String idPeriodEnd; + } + + } + + /** + * 经营资料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BusinessInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 商户简称 + */ + @SerializedName("merchant_shortname") + private String merchantShortname; + + /** + * 客服电话 + */ + @SerializedName("service_phone") + private String servicePhone; + + /** + * 经营场景 + */ + @SerializedName("sales_info") + private SalesInfo salesInfo; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SalesInfo { + + /** + * 经营场景类型 + */ + @SerializedName("sales_scenes_type") + private List salesScenesType; + + /** + * 线下门店场景 + */ + @SerializedName("biz_store_info") + private BizStoreInfo bizStoreInfo; + + /** + * 公众号场景 + */ + @SerializedName("mp_info") + private MpInfo mpInfo; + + /** + * 小程序场景 + */ + @SerializedName("mini_program_info") + private MiniProgramInfo miniProgramInfo; + + /** + * APP场景 + */ + @SerializedName("app_info") + private AppInfo appInfo; + + /** + * 互联网网站场景 + */ + @SerializedName("web_info") + private WebInfo webInfo; + + /** + * 企业微信场景 + */ + @SerializedName("wework_info") + private WeworkInfo weworkInfo; + + /** + * 线下门店场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BizStoreInfo { + + /** + * 门店名称 + */ + @SerializedName("biz_store_name") + private String bizStoreName; + + /** + * 门店省市编码 + */ + @SerializedName("biz_address_code") + private String bizAddressCode; + + /** + * 门店地址 + */ + @SerializedName("biz_store_address") + private String bizStoreAddress; + + /** + * 门店门头照片 + */ + @SerializedName("store_entrance_pic") + private List storeEntrancePic; + + /** + * 店内环境照片 + */ + @SerializedName("indoor_pic") + private List indoorPic; + + /** + * 线下场所对应的商家APPID + */ + @SerializedName("biz_sub_appid") + private String bizSubAppid; + + } + + /** + * 公众号场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MpInfo { + + /** + * 服务商公众号APPID + */ + @SerializedName("mp_appid") + private String mpAppid; + + /** + * 商家公众号APPID + */ + @SerializedName("mp_sub_appid") + private String mpSubAppid; + + /** + * 公众号页面截图 + */ + @SerializedName("mp_pics") + private List mpPics; + + } + + /** + * 小程序场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MiniProgramInfo { + + /** + * 服务商小程序APPID + */ + @SerializedName("mini_program_appid") + private String miniProgramAppid; + + /** + * 商家小程序APPID + */ + @SerializedName("mini_program_sub_appid") + private String miniProgramSubAppid; + + /** + * 小程序截图 + */ + @SerializedName("mini_program_pics") + private List miniProgramPics; + + + } + + /** + * APP场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AppInfo { + + /** + * 服务商应用APPID + */ + @SerializedName("app_appid") + private String appAppid; + + /** + * 商家应用APPID + */ + @SerializedName("app_sub_appid") + private String appSubAppid; + + /** + * APP截图 + */ + @SerializedName("app_pics") + private List appPics; + + } + + /** + * 互联网网站场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class WebInfo { + + /** + * 互联网网站域名 + */ + @SerializedName("domain") + private String domain; + + /** + * 网站授权函 + */ + @SerializedName("web_authorisation") + private String webAuthorisation; + + /** + * 互联网网站对应的商家APPID + */ + @SerializedName("web_appid") + private String webAppid; + + } + + /** + * 企业微信场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class WeworkInfo { + + /** + * 商家企业微信CorpID + */ + @SerializedName("sub_corp_id") + private String subCorpId; + + /** + * 企业微信页面截图 + */ + @SerializedName("wework_pics") + private List weworkPics; + + } + } + } + + /** + * 结算规则 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SettlementInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 入驻结算规则ID + */ + @SerializedName("settlement_id") + private String settlementId; + + /** + * 所属行业 + */ + @SerializedName("qualification_type") + private String qualificationType; + + /** + * 特殊资质图片 + */ + @SerializedName("qualifications") + private List qualifications; + + /** + * 优惠费率活动ID + */ + @SerializedName("activities_id") + private String activitiesId; + + /** + * 优惠费率活动值 + */ + @SerializedName("activities_rate") + private String activitiesRate; + + /** + * 优惠费率活动补充材料 + */ + @SerializedName("activities_additions") + private List activitiesAdditions; + + } + + /** + * 结算银行账户 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BankAccountInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 账户类型 + */ + @SerializedName("bank_account_type") + private BankAccountTypeEnum bankAccountType; + + /** + * 开户名称 + */ + @SerializedName("account_name") + @SpecEncrypt + private String accountName; + + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + + /** + * 开户银行省市编码 + */ + @SerializedName("bank_address_code") + private String bankAddressCode; + + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + + /** + * 开户银行全称(含支行] + */ + @SerializedName("bank_name") + private String bankName; + + /** + * 银行账号 + */ + @SerializedName("account_number") + @SpecEncrypt + private String accountNumber; + + } + + + /** + * 补充材料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AdditionInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 法人开户承诺函 + */ + @SerializedName("legal_person_commitment") + private String legalPersonCommitment; + + /** + * 法人开户意愿视频 + */ + @SerializedName("legal_person_video") + private String legalPersonVideo; + + /** + * 补充材料 + */ + @SerializedName("business_addition_pics") + private List businessAdditionPics; + + /** + * 补充说明 + */ + @SerializedName("business_addition_msg") + private String businessAdditionMsg; + + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java new file mode 100644 index 0000000000..d68ba0ce85 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java @@ -0,0 +1,31 @@ +package com.github.binarywang.wxpay.bean.applyment; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + + +/** + * 特约商户进件 提交申请结果响应 + * + * @author zhouyongshen + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class WxPayApplymentCreateResult implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 微信支付申请单号 + */ + @SerializedName("applyment_id") + private String applymentId; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java new file mode 100644 index 0000000000..3239709b6e --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java @@ -0,0 +1,18 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + + +/** + * 银行结算账户枚举类 + */ +public enum AccountTypeEnum { + /** + * 对公银行账户 + */ + ACCOUNT_TYPE_BUSINESS, + + /** + * 经营者个人银行卡 + */ + ACCOUNT_TYPE_PRIVATE, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java new file mode 100644 index 0000000000..50affe8772 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java @@ -0,0 +1,42 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 申请单状态枚举类 + * + * @author zhouyongshen + */ +public enum ApplymentStateEnum { + /** + * (编辑中):提交申请发生错误导致,请尝试重新提交。 + */ + APPLYMENT_STATE_EDITTING, + /** + * (审核中):申请单正在审核中,超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤。 + */ + APPLYMENT_STATE_AUDITING, + /** + * (已驳回):请按照驳回原因修改申请资料,超级管理员用微信打开“签约链接”,完成绑定微信号,后续申请单进度将通过微信公众号通知超级管理员。 + */ + APPLYMENT_STATE_REJECTED, + /** + * (待账户验证):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成账户验证。 + */ + APPLYMENT_STATE_TO_BE_CONFIRMED, + /** + * (待签约):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成签约。 + */ + APPLYMENT_STATE_TO_BE_SIGNED, + /** + * (开通权限中):系统开通相关权限中,请耐心等待。 + */ + APPLYMENT_STATE_SIGNING, + /** + * (已完成):商户入驻申请已完成。 + */ + APPLYMENT_STATE_FINISHED, + /** + * (已作废):申请单已被撤销。 + */ + APPLYMENT_STATE_CANCELED + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java new file mode 100644 index 0000000000..5d566702e7 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java @@ -0,0 +1,18 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + + +/** + * 银行结算账户枚举类 + */ +public enum BankAccountTypeEnum { + /** + * 对公银行账户 + */ + BANK_ACCOUNT_TYPE_CORPORATE, + + /** + * 经营者个人银行卡 + */ + BANK_ACCOUNT_TYPE_PERSONAL, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java new file mode 100644 index 0000000000..89ca59d199 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java @@ -0,0 +1,60 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 登记证书的类型枚举 + */ +public enum CertTypeEnum { + /** + * 事业单位法人证书 + */ + CERTIFICATE_TYPE_2388, + /** + * 统一社会信用代码证书 + */ + CERTIFICATE_TYPE_2389, + /** + * 有偿服务许可证(军队医院适用) + */ + CERTIFICATE_TYPE_2390, + /** + * 医疗机构执业许可证(军队医院适用) + */ + CERTIFICATE_TYPE_2391, + /** + * 企业营业执照(挂靠企业的党组织适用) + */ + CERTIFICATE_TYPE_2392, + /** + * 组织机构代码证(政府机关适用) + */ + CERTIFICATE_TYPE_2393, + /** + * 社会团体法人登记证书 + */ + CERTIFICATE_TYPE_2394, + /** + * 民办非企业单位登记证书 + */ + CERTIFICATE_TYPE_2395, + /** + * 基金会法人登记证书 + */ + CERTIFICATE_TYPE_2396, + /** + * 慈善组织公开募捐资格证书 + */ + CERTIFICATE_TYPE_2397, + /** + * 农民专业合作社法人营业执照 + */ + CERTIFICATE_TYPE_2398, + /** + * 宗教活动场所登记证 + */ + CERTIFICATE_TYPE_2399, + /** + * 其他证书/批文/证明 + */ + CERTIFICATE_TYPE_2400, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java new file mode 100644 index 0000000000..7bf88e6b56 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java @@ -0,0 +1,29 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 个体户/企业/党政、机关及事业单位/其他组织:可选择任一证件类型。 + * 枚举值 + */ +public enum IdTypeEnum { + /** + * 中国大陆居民-身份证 + */ + IDENTIFICATION_TYPE_IDCARD, + /** + * 其他国家或地区居民-护照 + */ + IDENTIFICATION_TYPE_OVERSEA_PASSPORT, + /** + * 中国香港居民-来往内地通行证 + */ + IDENTIFICATION_TYPE_HONGKONG_PASSPORT, + /** + * 中国澳门居民-来往内地通行证 + */ + IDENTIFICATION_TYPE_MACAO_PASSPORT, + /** + * 中国台湾居民-来往大陆通行证 + */ + IDENTIFICATION_TYPE_TAIWAN_PASSPORT, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java new file mode 100644 index 0000000000..baf4d18397 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java @@ -0,0 +1,32 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 经营场景类型枚举值 + */ +public enum SalesScenesTypeEnum { + /** + * 线下门店 + */ + SALES_SCENES_STORE, + /** + * 公众号 + */ + SALES_SCENES_MP, + /** + * 小程序 + */ + SALES_SCENES_MINI_PROGRAM, + /** + * 互联网 + */ + SALES_SCENES_WEB, + /** + * APP + */ + SALES_SCENES_APP, + /** + * 企业微信 + */ + SALES_SCENES_WEWORK, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java new file mode 100644 index 0000000000..f26e6c09f5 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java @@ -0,0 +1,23 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 返回特约商户的结算账户-汇款验证结果枚举类 + * + * @author zhouyognshen + */ +public enum SettlementVerifyResultEnum { + /** + * 系统汇款验证中,商户可发起提现尝试。 + */ + VERIFYING, + /** + * 系统成功汇款,该账户可正常发起提现。 + */ + VERIFY_SUCCESS, + /** + * 系统汇款失败,该账户无法发起提现,请检查修改。 + */ + VERIFY_FAIL, + ; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java new file mode 100644 index 0000000000..c1555b7c57 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java @@ -0,0 +1,28 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 主体类型枚举类 + *
+ *     商户申请接入时如何选择主体类型? https://kf.qq.com/faq/180910IBZVnQ180910naQ77b.html
+ * 
+ * @author zhouyongshen + */ +public enum SubjectTypeEnum { + /** + * (个体户):营业执照上的主体类型一般为个体户、个体工商户、个体经营; + */ + SUBJECT_TYPE_INDIVIDUAL, + /** + * (企业):营业执照上的主体类型一般为有限公司、有限责任公司; + */ + SUBJECT_TYPE_ENTERPRISE, + /** + * (党政、机关及事业单位):包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构); + */ + SUBJECT_TYPE_INSTITUTIONS, + /** + * (其他组织):不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。 + */ + SUBJECT_TYPE_OTHERS,; + +} 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 4ee1ed7075..f5cd91c6c3 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 @@ -6,6 +6,7 @@ import com.github.binarywang.wxpay.v3.util.PemUtils; import jodd.util.ResourcesUtil; import lombok.Data; +import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.StringUtils; @@ -169,6 +170,15 @@ public String getPayBaseUrl() { return this.payBaseUrl; } + @SneakyThrows + public Verifier getVerifier() { + if (verifier == null) { + //当改对象为null时,初始化api v3的请求头 + initApiV3HttpClient(); + } + return verifier; + } + /** * 初始化ssl. * diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java new file mode 100644 index 0000000000..2187de0c09 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java @@ -0,0 +1,67 @@ +package com.github.binarywang.wxpay.service; + +import com.github.binarywang.wxpay.bean.applyment.*; +import com.github.binarywang.wxpay.exception.WxPayException; + +/** + * 特约商户进件 + * 产品介绍:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter1_1.shtml + * + * @author zhouyongshen + */ +public interface Applyment4SubService { + /** + * 提交申请单API + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_1.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/ + * + * @param request 请求对象 + * @return WxPayApplymentCreateResult 响应结果 + * @throws WxPayException the wx pay exception + */ + WxPayApplymentCreateResult createApply(WxPayApplyment4SubCreateRequest request) throws WxPayException; + + + + /** + * 通过业务申请编号查询申请状态 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_2.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/business_code/{business_code} + * + * @param businessCode 业务申请编号 + * 1、只能由数字、字母或下划线组成,建议前缀为服务商商户号。 + * 2、服务商自定义的唯一编号。 + * 3、每个编号对应一个申请单,每个申请单审核通过后生成一个微信支付商户号。 + * 4、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息。 + * 示例值:1900013511_10000 + */ + ApplymentStateQueryResult queryApplyStatusByBusinessCode(String businessCode) throws WxPayException; + + /** + * 通过申请单号查询申请状态 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_2.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/applyment_id/{applyment_id} + * + * @param applymentId 微信支付分的申请单号。示例值:2000001234567890 + */ + ApplymentStateQueryResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException; + + /** + * 通过申请单号查询申请状态 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_4.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/settlement + * + * @param subMchid 本服务商进件、已签约的特约商户号。 + */ + SettlementInfoResult querySettlementBySubMchid(String subMchid) throws WxPayException; + + /** + * 修改结算帐号 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_3.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/modify-settlement + * @param subMchid 特约商户号 + * @param request 修改结算账户请求对象信息 + */ + void modifySettlement(String subMchid,ModifySettlementRequest 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 565db9c6a9..da7652ef69 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 @@ -66,6 +66,18 @@ public interface WxPayService { */ String postV3(String url, String requestStr) throws WxPayException; + /** + * 发送post请求,得到响应字符串. + * + * 部分字段会包含敏感信息,所以在提交前需要在请求头中会包含"Wechatpay-Serial"信息 + * + * @param url 请求地址 + * @param requestStr 请求信息 + * @return 返回请求结果字符串 string + * @throws WxPayException the wx pay exception + */ + String postV3WithWechatpaySerial(String url, String requestStr) throws WxPayException; + /** * 发送post请求,得到响应字符串. * diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImpl.java new file mode 100644 index 0000000000..defb01a9fd --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImpl.java @@ -0,0 +1,68 @@ +package com.github.binarywang.wxpay.service.impl; + +import com.github.binarywang.wxpay.bean.applyment.*; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.Applyment4SubService; +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; + +import java.net.URI; +import java.security.cert.X509Certificate; + +@Slf4j +@RequiredArgsConstructor +public class Applyment4SubServiceImpl implements Applyment4SubService { + + private static final Gson GSON = new GsonBuilder().create(); + private final WxPayService payService; + + private void encryptFiled(Object request) throws WxPayException { + + X509Certificate validCertificate = payService.getConfig().getVerifier().getValidCertificate(); + + RsaCryptoUtil.encryptFields(request, validCertificate); + } + + + @Override + public WxPayApplymentCreateResult createApply(WxPayApplyment4SubCreateRequest request) throws WxPayException { + String url = String.format("%s/v3/applyment4sub/applyment/", this.payService.getPayBaseUrl()); + + encryptFiled(request); + + String result = payService.postV3WithWechatpaySerial(url, GSON.toJson(request)); + return GSON.fromJson(result, WxPayApplymentCreateResult.class); + } + + @Override + public ApplymentStateQueryResult queryApplyStatusByBusinessCode(String businessCode) throws WxPayException { + String url = String.format("%s/v3/applyment4sub/applyment/business_code/%s", this.payService.getPayBaseUrl(), businessCode); + String result = payService.getV3(URI.create(url)); + return GSON.fromJson(result, ApplymentStateQueryResult.class); + } + + @Override + public ApplymentStateQueryResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException { + String url = String.format("%s/v3/applyment4sub/applyment/applyment_id/%s", this.payService.getPayBaseUrl(), applymentId); + String result = payService.getV3(URI.create(url)); + return GSON.fromJson(result, ApplymentStateQueryResult.class); + } + + @Override + public SettlementInfoResult querySettlementBySubMchid(String subMchid) throws WxPayException { + String url = String.format("%s/v3/apply4sub/sub_merchants/%s/settlement", this.payService.getPayBaseUrl(), subMchid); + String result = payService.getV3(URI.create(url)); + return GSON.fromJson(result, SettlementInfoResult.class); + } + + @Override + public void modifySettlement(String subMchid,ModifySettlementRequest request) throws WxPayException { + String url = String.format("%s/v3/apply4sub/sub_merchants/%s/modify-settlement", this.payService.getPayBaseUrl(), subMchid); + encryptFiled(request); + String result = payService.postV3WithWechatpaySerial(url, GSON.toJson(request)); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java index 7c4f2021a1..7923c4723e 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java @@ -6,6 +6,7 @@ import jodd.util.Base64; import me.chanjar.weixin.common.util.json.GsonParser; import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpStatus; import org.apache.http.auth.AuthScope; @@ -26,6 +27,7 @@ import org.apache.http.util.EntityUtils; import javax.net.ssl.SSLContext; +import java.math.BigInteger; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -116,6 +118,40 @@ public String postV3(String url, String requestStr) throws WxPayException { } + @Override + public String postV3WithWechatpaySerial(String url, String requestStr) throws WxPayException { + CloseableHttpClient httpClient = this.createApiV3HttpClient(); + HttpPost httpPost = this.createHttpPost(url, requestStr); + httpPost.addHeader("Accept", "application/json"); + httpPost.addHeader("Content-Type", "application/json"); + String serialNumber = getConfig().getVerifier().getValidCertificate().getSerialNumber().toString(16).toUpperCase(); + httpPost.addHeader("Wechatpay-Serial", serialNumber); + try (CloseableHttpResponse response = httpClient.execute(httpPost)) { + //v3已经改为通过状态码判断200 204 成功 + int statusCode = response.getStatusLine().getStatusCode(); + String responseString="{}"; + HttpEntity entity = response.getEntity(); + if(entity!=null){ + responseString= EntityUtils.toString(entity, StandardCharsets.UTF_8); + } + + if (HttpStatus.SC_OK == statusCode || HttpStatus.SC_NO_CONTENT == statusCode) { + this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据】:{}", url, requestStr, responseString); + return responseString; + } else { + //有错误提示信息返回 + JsonObject jsonObject = GsonParser.parse(responseString); + throw new WxPayException(jsonObject.get("message").getAsString()); + } + } catch (Exception e) { + this.log.error("\n【请求地址】:{}\n【请求数据】:{}\n【异常信息】:{}", url, requestStr, e.getMessage()); + e.printStackTrace(); + throw new WxPayException(e.getMessage(), e); + } finally { + httpPost.releaseConnection(); + } + } + @Override public String postV3(String url, HttpPost httpPost) throws WxPayException { diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java index 91292e8101..b7ef11695e 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java @@ -66,6 +66,11 @@ public String postV3(String url, String requestStr) throws WxPayException { return null; } + @Override + public String postV3WithWechatpaySerial(String url, String requestStr) throws WxPayException { + return null; + } + @Override public String postV3(String url, HttpPost httpPost) throws WxPayException { return null; diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/SpecEncrypt.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/SpecEncrypt.java new file mode 100644 index 0000000000..4f1eb9e582 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/SpecEncrypt.java @@ -0,0 +1,16 @@ +package com.github.binarywang.wxpay.v3; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 敏感信息字段 + * @author zhouyognshen + **/ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface SpecEncrypt { + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java new file mode 100644 index 0000000000..b6ab923168 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java @@ -0,0 +1,99 @@ +package com.github.binarywang.wxpay.v3.util; + +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.v3.SpecEncrypt; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.cert.X509Certificate; +import java.util.Base64; + +/** + * 微信支付敏感信息加密 + * 文档见: https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/min-gan-xin-xi-jia-mi + * + * @author zhouyongshen + **/ +public class RsaCryptoUtil { + + + static String JAVA_LANG_STRING = "java.lang.String"; + + public static void encryptFields(Object encryptObject, X509Certificate certificate) throws WxPayException { + try { + encryptField(encryptObject, certificate); + } catch (IllegalAccessException | IllegalBlockSizeException e) { + throw new WxPayException("敏感信息加密失败", e); + } catch (Exception e2) { + throw new WxPayException("敏感信息加密失败", e2); + } + } + + private static void encryptField(Object encryptObject, X509Certificate certificate) throws IllegalAccessException, IllegalBlockSizeException { + Class infoClass = encryptObject.getClass(); + Field[] infoFieldArray = infoClass.getDeclaredFields(); + for (Field field : infoFieldArray) { + if (field.isAnnotationPresent(SpecEncrypt.class)) { + //字段使用了@SpecEncrypt进行标识 + if (field.getType().getTypeName().equals(JAVA_LANG_STRING)) { + field.setAccessible(true); + Object oldValue = field.get(encryptObject); + if (oldValue != null) { + String oldStr = (String) oldValue; + if (!oldStr.trim().equals("'")) { + field.set(encryptObject, encryptOAEP(oldStr, certificate)); + } + } + } else { + field.setAccessible(true); + Object obj = field.get(encryptObject); + if (obj != null) { + encryptField(field.get(encryptObject), certificate); + } + } + } + } + } + + public static String encryptOAEP(String message, X509Certificate certificate) + throws IllegalBlockSizeException { + try { + Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding"); + cipher.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey()); + + byte[] data = message.getBytes(StandardCharsets.UTF_8); + byte[] ciphertext = cipher.doFinal(data); + return Base64.getEncoder().encodeToString(ciphertext); + } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { + throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e); + } catch (InvalidKeyException e) { + throw new IllegalArgumentException("无效的证书", e); + } catch (IllegalBlockSizeException | BadPaddingException e) { + throw new IllegalBlockSizeException("加密原串的长度不能超过214字节"); + } + } + + public static String decryptOAEP(String ciphertext, PrivateKey privateKey) + throws BadPaddingException { + try { + Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + byte[] data = Base64.getDecoder().decode(ciphertext); + return new String(cipher.doFinal(data), StandardCharsets.UTF_8); + } catch (NoSuchPaddingException | NoSuchAlgorithmException e) { + throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e); + } catch (InvalidKeyException e) { + throw new IllegalArgumentException("无效的私钥", e); + } catch (BadPaddingException | IllegalBlockSizeException e) { + throw new BadPaddingException("解密失败"); + } + } +} diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImplTest.java new file mode 100644 index 0000000000..da268ce9e8 --- /dev/null +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImplTest.java @@ -0,0 +1,87 @@ +package com.github.binarywang.wxpay.service.impl; + +import com.github.binarywang.wxpay.bean.applyment.ModifySettlementRequest; +import com.github.binarywang.wxpay.bean.applyment.WxPayApplyment4SubCreateRequest; +import com.github.binarywang.wxpay.bean.applyment.WxPayApplymentCreateResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.Applyment4SubService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.testbase.ApiTestModule; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +@Slf4j +@Test +@Guice(modules = ApiTestModule.class) +public class Applyment4SubServiceImplTest { + @Inject + private WxPayService wxPayService; + + private static final Gson GSON = new GsonBuilder().create(); + + @Test + public void testCreateApply() throws WxPayException { + Applyment4SubService applyment4SubService=new Applyment4SubServiceImpl(wxPayService); + String requestParamStr="{}"; + /* + {"business_code":"1596785690732","contact_info":{"contact_name":"张三","contact_id_number":"110110202001011234","mobile_phone":"13112345678","contact_email":"abc@qq.com"},"subject_info":{"subject_type":"SUBJECT_TYPE_ENTERPRISE","business_license_info":{"license_copy":"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI","license_number":"123456789012345678","merchant_name":"腾讯科技有限公司","legal_person":"张三"},"identity_info":{"id_doc_type":"IDENTIFICATION_TYPE_IDCARD","id_card_info":{"id_card_copy":"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI","id_card_national":"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI","id_card_name":"张三","id_card_number":"110110202001011234","card_period_begin":"2016-06-06","card_period_end":"2026-06-06"},"owner":false},"ubo_info":{"id_type":"IDENTIFICATION_TYPE_IDCARD","id_card_copy":"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI","id_card_national":"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI","id_doc_copy":"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI","name":"张三","id_number":"110110202001011234","id_period_begin":"2016-06-06","id_period_end":"2026-06-06"}},"business_info":{"merchant_shortname":"商户简称","service_phone":"13212345678","sales_info":{"sales_scenes_type":["SALES_SCENES_MINI_PROGRAM"],"mini_program_info":{"mini_program_appid":"wxe5f52902cf4de896"}}},"settlement_info":{"settlement_id":"716","qualification_type":"餐饮"}} + */ + requestParamStr="{\"business_code\":\"1596785690732\",\"contact_info\":{\"contact_name\":\"张三\",\"contact_id_number\":\"110110202001011234\",\"mobile_phone\":\"13112345678\",\"contact_email\":\"abc@qq.com\"},\"subject_info\":{\"subject_type\":\"SUBJECT_TYPE_ENTERPRISE\",\"business_license_info\":{\"license_copy\":\"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI\",\"license_number\":\"123456789012345678\",\"merchant_name\":\"腾讯科技有限公司\",\"legal_person\":\"张三\"},\"identity_info\":{\"id_doc_type\":\"IDENTIFICATION_TYPE_IDCARD\",\"id_card_info\":{\"id_card_copy\":\"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI\",\"id_card_national\":\"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI\",\"id_card_name\":\"张三\",\"id_card_number\":\"110110202001011234\",\"card_period_begin\":\"2016-06-06\",\"card_period_end\":\"2026-06-06\"},\"owner\":false},\"ubo_info\":{\"id_type\":\"IDENTIFICATION_TYPE_IDCARD\",\"id_card_copy\":\"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI\",\"id_card_national\":\"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI\",\"id_doc_copy\":\"mxX07DyfM-bJyGJYCTyW-4wrXpJ5fq_bgYfWkIZZgjenf6Ct1gKV_FpkzgyQrf5ETVEyOWhC_0cbhOATODuLBAkxGl6Cvj31lh6OFAIHnwI\",\"name\":\"张三\",\"id_number\":\"110110202001011234\",\"id_period_begin\":\"2016-06-06\",\"id_period_end\":\"2026-06-06\"}},\"business_info\":{\"merchant_shortname\":\"商户简称\",\"service_phone\":\"13212345678\",\"sales_info\":{\"sales_scenes_type\":[\"SALES_SCENES_MINI_PROGRAM\"],\"mini_program_info\":{\"mini_program_appid\":\"wxe5f52902cf4de896\"}}},\"settlement_info\":{\"settlement_id\":\"716\",\"qualification_type\":\"餐饮\"}}"; + + WxPayApplyment4SubCreateRequest request=GSON.fromJson(requestParamStr,WxPayApplyment4SubCreateRequest.class); + String businessCode = String.valueOf(System.currentTimeMillis()); + request.setBusinessCode(businessCode); + + WxPayApplymentCreateResult apply = applyment4SubService.createApply(request); + String applymentId = apply.getApplymentId(); + log.info("businessCode:[{}],applymentId:[{}]",businessCode,applymentId); + + } + + @Test + public void testQueryApplyStatusByBusinessCode() throws WxPayException { + Applyment4SubService applyment4SubService=new Applyment4SubServiceImpl(wxPayService); + String businessCode="businessCode"; + + applyment4SubService.queryApplyStatusByBusinessCode(businessCode); + + + } + + @Test + public void testQueryApplyStatusByApplymentId() throws WxPayException { + Applyment4SubService applyment4SubService=new Applyment4SubServiceImpl(wxPayService); + String applymentId="applymentId"; + + applyment4SubService.queryApplyStatusByApplymentId(applymentId); + + } + + @Test + public void testQuerySettlementBySubMchid() throws WxPayException { + Applyment4SubService applyment4SubService=new Applyment4SubServiceImpl(wxPayService); + String subMchid="subMchid"; + + applyment4SubService.querySettlementBySubMchid(subMchid); + + } + + @Test + public void testModifySettlement() throws WxPayException { + Applyment4SubService applyment4SubService=new Applyment4SubServiceImpl(wxPayService); + String subMchid="subMchid"; + ModifySettlementRequest modifySettlementRequest = new ModifySettlementRequest(); + + applyment4SubService.modifySettlement(subMchid,modifySettlementRequest); + } + + + + + + +} From c588303d8aeeef91e4401c9b85fa0da076c17772 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 8 Aug 2020 16:25:34 +0800 Subject: [PATCH 65/90] =?UTF-8?q?:art:=20#1700=20=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7WxMpConfigStorage=E6=8E=A5=E5=8F=A3=E6=8F=90=E4=BE=9Bs?= =?UTF-8?q?etHostConfig()=E6=96=B9=E6=B3=95=EF=BC=8C=E6=96=B9=E4=BE=BF?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E7=9B=B8=E5=85=B3=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/config/WxMpConfigStorage.java | 110 +++++++++++++++++- .../mp/config/impl/WxMpDefaultConfigImpl.java | 31 +++-- 2 files changed, 127 insertions(+), 14 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/WxMpConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/WxMpConfigStorage.java index d0d7003a25..88520adf6f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/WxMpConfigStorage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/WxMpConfigStorage.java @@ -1,9 +1,9 @@ package me.chanjar.weixin.mp.config; import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.enums.TicketType; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; import me.chanjar.weixin.mp.bean.WxMpHostConfig; -import me.chanjar.weixin.common.enums.TicketType; import java.io.File; import java.util.concurrent.locks.Lock; @@ -14,10 +14,25 @@ * @author chanjarster */ public interface WxMpConfigStorage { + /** + * Gets access token. + * + * @return the access token + */ String getAccessToken(); + /** + * Gets access token lock. + * + * @return the access token lock + */ Lock getAccessTokenLock(); + /** + * Is access token expired boolean. + * + * @return the boolean + */ boolean isAccessTokenExpired(); /** @@ -40,14 +55,34 @@ public interface WxMpConfigStorage { */ void updateAccessToken(String accessToken, int expiresInSeconds); + /** + * Gets ticket. + * + * @param type the type + * @return the ticket + */ String getTicket(TicketType type); + /** + * Gets ticket lock. + * + * @param type the type + * @return the ticket lock + */ Lock getTicketLock(TicketType type); + /** + * Is ticket expired boolean. + * + * @param type the type + * @return the boolean + */ boolean isTicketExpired(TicketType type); /** * 强制将ticket过期掉. + * + * @param type the type */ void expireTicket(TicketType type); @@ -61,44 +96,115 @@ public interface WxMpConfigStorage { */ void updateTicket(TicketType type, String ticket, int expiresInSeconds); + /** + * Gets app id. + * + * @return the app id + */ String getAppId(); + /** + * Gets secret. + * + * @return the secret + */ String getSecret(); + /** + * Gets token. + * + * @return the token + */ String getToken(); + /** + * Gets aes key. + * + * @return the aes key + */ String getAesKey(); + /** + * Gets template id. + * + * @return the template id + */ String getTemplateId(); + /** + * Gets expires time. + * + * @return the expires time + */ long getExpiresTime(); + /** + * Gets oauth 2 redirect uri. + * + * @return the oauth 2 redirect uri + */ String getOauth2redirectUri(); + /** + * Gets http proxy host. + * + * @return the http proxy host + */ String getHttpProxyHost(); + /** + * Gets http proxy port. + * + * @return the http proxy port + */ int getHttpProxyPort(); + /** + * Gets http proxy username. + * + * @return the http proxy username + */ String getHttpProxyUsername(); + /** + * Gets http proxy password. + * + * @return the http proxy password + */ String getHttpProxyPassword(); + /** + * Gets tmp dir file. + * + * @return the tmp dir file + */ File getTmpDirFile(); /** * http client builder. * - * @return ApacheHttpClientBuilder + * @return ApacheHttpClientBuilder apache http client builder */ ApacheHttpClientBuilder getApacheHttpClientBuilder(); /** * 是否自动刷新token. + * + * @return the boolean */ boolean autoRefreshToken(); /** * 得到微信接口地址域名部分的自定义设置信息. + * + * @return the host config */ WxMpHostConfig getHostConfig(); + + /** + * 设置微信接口地址域名部分的自定义设置信息. + * + * @param hostConfig host config + */ + void setHostConfig(WxMpHostConfig hostConfig); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpDefaultConfigImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpDefaultConfigImpl.java index 0cb350f72d..637b7b5576 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpDefaultConfigImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpDefaultConfigImpl.java @@ -1,18 +1,18 @@ package me.chanjar.weixin.mp.config.impl; -import java.io.File; -import java.io.Serializable; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - import lombok.Data; import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.enums.TicketType; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; -import me.chanjar.weixin.mp.config.WxMpConfigStorage; import me.chanjar.weixin.mp.bean.WxMpHostConfig; -import me.chanjar.weixin.common.enums.TicketType; +import me.chanjar.weixin.mp.config.WxMpConfigStorage; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import java.io.File; +import java.io.Serializable; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + /** * 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化. * @@ -46,15 +46,17 @@ public class WxMpDefaultConfigImpl implements WxMpConfigStorage, Serializable { protected volatile String cardApiTicket; protected volatile long cardApiTicketExpiresTime; - protected Lock accessTokenLock = new ReentrantLock(); - protected Lock jsapiTicketLock = new ReentrantLock(); - protected Lock sdkTicketLock = new ReentrantLock(); - protected Lock cardApiTicketLock = new ReentrantLock(); + protected volatile Lock accessTokenLock = new ReentrantLock(); + protected volatile Lock jsapiTicketLock = new ReentrantLock(); + protected volatile Lock sdkTicketLock = new ReentrantLock(); + protected volatile Lock cardApiTicketLock = new ReentrantLock(); protected volatile File tmpDirFile; protected volatile ApacheHttpClientBuilder apacheHttpClientBuilder; + private WxMpHostConfig hostConfig = null; + @Override public boolean isAccessTokenExpired() { return System.currentTimeMillis() > this.expiresTime; @@ -183,7 +185,12 @@ public boolean autoRefreshToken() { @Override public WxMpHostConfig getHostConfig() { - return null; + return this.hostConfig; + } + + @Override + public void setHostConfig(WxMpHostConfig hostConfig) { + this.hostConfig = hostConfig; } } From 542b633c7003bc8fda38b8a8263d452b0c178d12 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 8 Aug 2020 16:44:02 +0800 Subject: [PATCH 66/90] =?UTF-8?q?:art:=20=E9=87=8D=E6=9E=84=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=83=A8=E5=88=86=E5=8C=85=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/common/{ => enums}/WxType.java | 2 +- .../src/main/java/me/chanjar/weixin/common/error/WxError.java | 2 +- .../ocr/OcrDiscernApacheHttpRequestExecutor.java | 4 ++-- .../requestexecuter/ocr/OcrDiscernRequestExecutor.java | 4 ++-- .../common/util/http/BaseMediaDownloadRequestExecutor.java | 2 +- .../weixin/common/util/http/MediaUploadRequestExecutor.java | 2 +- .../me/chanjar/weixin/common/util/http/RequestExecutor.java | 2 +- .../weixin/common/util/http/SimpleGetRequestExecutor.java | 2 +- .../weixin/common/util/http/SimplePostRequestExecutor.java | 2 +- .../util/http/apache/ApacheMediaDownloadRequestExecutor.java | 2 +- .../util/http/apache/ApacheMediaUploadRequestExecutor.java | 2 +- .../util/http/apache/ApacheSimpleGetRequestExecutor.java | 2 +- .../util/http/apache/ApacheSimplePostRequestExecutor.java | 2 +- .../util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java | 2 +- .../util/http/jodd/JoddHttpMediaUploadRequestExecutor.java | 2 +- .../util/http/jodd/JoddHttpSimpleGetRequestExecutor.java | 2 +- .../util/http/jodd/JoddHttpSimplePostRequestExecutor.java | 2 +- .../util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java | 2 +- .../util/http/okhttp/OkHttpMediaUploadRequestExecutor.java | 2 +- .../util/http/okhttp/OkHttpSimpleGetRequestExecutor.java | 2 +- .../util/http/okhttp/OkHttpSimplePostRequestExecutor.java | 2 +- .../test/java/me/chanjar/weixin/common/error/WxErrorTest.java | 2 +- .../me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java | 2 +- .../me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java | 2 +- .../me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java | 2 +- .../weixin/cp/api/impl/WxCpServiceApacheHttpClientImpl.java | 2 +- .../java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java | 2 +- .../chanjar/weixin/cp/api/impl/WxCpServiceJoddHttpImpl.java | 2 +- .../me/chanjar/weixin/cp/api/impl/WxCpServiceOkHttpImpl.java | 2 +- .../weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java | 2 +- .../binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java | 2 +- .../wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java | 2 +- .../binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java | 2 +- .../cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java | 2 +- .../cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java | 2 +- .../wx/miniapp/util/QrcodeBytesRequestExecutor.java | 2 +- .../cn/binarywang/wx/miniapp/util/QrcodeRequestExecutor.java | 2 +- .../me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java | 2 +- .../me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java | 3 +-- .../me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java | 2 +- .../chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java | 2 +- .../me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java | 2 +- .../me/chanjar/weixin/mp/api/impl/WxMpShakeServiceImpl.java | 2 +- .../me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java | 2 +- .../weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java | 2 +- .../me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java | 2 +- .../material/MaterialDeleteApacheHttpRequestExecutor.java | 2 +- .../material/MaterialDeleteJoddHttpRequestExecutor.java | 2 +- .../material/MaterialDeleteOkhttpRequestExecutor.java | 2 +- .../material/MaterialDeleteRequestExecutor.java | 2 +- .../material/MaterialNewsInfoApacheHttpRequestExecutor.java | 2 +- .../material/MaterialNewsInfoJoddHttpRequestExecutor.java | 2 +- .../material/MaterialNewsInfoOkhttpRequestExecutor.java | 2 +- .../material/MaterialNewsInfoRequestExecutor.java | 2 +- .../material/MaterialUploadApacheHttpRequestExecutor.java | 2 +- .../material/MaterialUploadJoddHttpRequestExecutor.java | 2 +- .../material/MaterialUploadOkhttpRequestExecutor.java | 2 +- .../material/MaterialUploadRequestExecutor.java | 2 +- .../material/MaterialVideoInfoApacheHttpRequestExecutor.java | 2 +- .../material/MaterialVideoInfoJoddHttpRequestExecutor.java | 2 +- .../material/MaterialVideoInfoOkhttpRequestExecutor.java | 2 +- .../material/MaterialVideoInfoRequestExecutor.java | 2 +- ...aterialVoiceAndImageDownloadApacheHttpRequestExecutor.java | 2 +- .../MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java | 2 +- .../MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java | 2 +- .../MaterialVoiceAndImageDownloadRequestExecutor.java | 2 +- .../media/MediaImgUploadApacheHttpRequestExecutor.java | 2 +- .../media/MediaImgUploadHttpRequestExecutor.java | 2 +- .../media/MediaImgUploadOkhttpRequestExecutor.java | 2 +- .../requestexecuter/media/MediaImgUploadRequestExecutor.java | 2 +- .../qrcode/QrCodeApacheHttpRequestExecutor.java | 2 +- .../requestexecuter/qrcode/QrCodeJoddHttpRequestExecutor.java | 2 +- .../requestexecuter/qrcode/QrCodeOkhttpRequestExecutor.java | 2 +- .../mp/util/requestexecuter/qrcode/QrCodeRequestExecutor.java | 2 +- .../voice/VoiceUploadApacheHttpRequestExecutor.java | 2 +- .../requestexecuter/voice/VoiceUploadRequestExecutor.java | 2 +- .../weixin/open/api/impl/WxOpenServiceAbstractImpl.java | 2 +- .../open/executor/MaQrCodeApacheHttpRequestExecutor.java | 2 +- .../weixin/open/executor/MaQrCodeJoddHttpRequestExecutor.java | 2 +- .../weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java | 2 +- .../chanjar/weixin/open/executor/MaQrCodeRequestExecutor.java | 2 +- 81 files changed, 83 insertions(+), 84 deletions(-) rename weixin-java-common/src/main/java/me/chanjar/weixin/common/{ => enums}/WxType.java (90%) rename weixin-java-common/src/main/java/me/chanjar/weixin/{mp/util => common}/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java (95%) rename weixin-java-common/src/main/java/me/chanjar/weixin/{mp/util => common}/requestexecuter/ocr/OcrDiscernRequestExecutor.java (91%) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/WxType.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/enums/WxType.java similarity index 90% rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/WxType.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/enums/WxType.java index 4230506763..de047beb1d 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/WxType.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/enums/WxType.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.common; +package me.chanjar.weixin.common.enums; /** *
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java
index d53e7fb25c..f1be843827 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java
@@ -2,7 +2,7 @@
 
 import lombok.Builder;
 import lombok.Data;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
similarity index 95%
rename from weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
index 033126d50f..2a84ac0e8b 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
-package me.chanjar.weixin.mp.util.requestexecuter.ocr;
+package me.chanjar.weixin.common.requestexecuter.ocr;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/requestexecuter/ocr/OcrDiscernRequestExecutor.java
similarity index 91%
rename from weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java
rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/requestexecuter/ocr/OcrDiscernRequestExecutor.java
index dff256e472..38926e72e5 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/requestexecuter/ocr/OcrDiscernRequestExecutor.java
@@ -1,6 +1,6 @@
-package me.chanjar.weixin.mp.util.requestexecuter.ocr;
+package me.chanjar.weixin.common.requestexecuter.ocr;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java
index 5c49c0f78d..ed5ec17bc9 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java
@@ -3,7 +3,7 @@
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.apache.ApacheMediaDownloadRequestExecutor;
 import me.chanjar.weixin.common.util.http.jodd.JoddHttpMediaDownloadRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java
index df1444cc75..14724412f1 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java
@@ -3,7 +3,7 @@
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.apache.ApacheMediaUploadRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
index 3d0b772f94..da1292ba62 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.util.http;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 
 import java.io.IOException;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
index f221cdcbbe..a0ce7a17e2 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
@@ -2,7 +2,7 @@
 
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+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.apache.ApacheSimpleGetRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java
index 804f13fe54..c0952b32d4 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.util.http;
 
-import me.chanjar.weixin.common.WxType;
+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.apache.ApacheSimplePostRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
index aeb3bb301e..5bb4aeba90 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.util.http.apache;
 
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java
index 3c1b15dc9a..ca33b8641f 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.util.http.apache;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java
index 2c536c4241..6b365edd09 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.util.http.apache;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
index 493295bc9e..4e6f31ec67 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.util.http.apache;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java
index df508869f0..5c67cbffe1 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaDownloadRequestExecutor.java
@@ -5,7 +5,7 @@
 import jodd.http.HttpResponse;
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java
index 3c7122a1f8..93f25fb740 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java
@@ -5,7 +5,7 @@
 import jodd.http.HttpResponse;
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java
index c549967e17..e8adad6b66 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java
@@ -5,7 +5,7 @@
 import jodd.http.HttpResponse;
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimplePostRequestExecutor.java
index 08dd9792ed..7b2f5f61ef 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimplePostRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimplePostRequestExecutor.java
@@ -5,7 +5,7 @@
 import jodd.http.HttpResponse;
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
index 86710ccced..ff0cea1c2b 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.common.util.http.okhttp;
 
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java
index 2fef1f93ca..6d2602d3df 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.util.http.okhttp;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java
index 4447bb268b..9be073e38a 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.util.http.okhttp;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimplePostRequestExecutor.java
index d4351b87ac..788ea59260 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimplePostRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimplePostRequestExecutor.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.common.util.http.okhttp;
 
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java
index 79b80e63aa..456a58ad76 100644
--- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java
+++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.common.error;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import org.testng.annotations.Test;
 
 import static org.testng.Assert.assertEquals;
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 416d128d51..75cf92aa9c 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
@@ -4,7 +4,7 @@
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
index 2f5872b04d..b58672f3a3 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
@@ -4,7 +4,7 @@
 import com.google.gson.JsonObject;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java
index d294c508fb..4dd661fbf0 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java
@@ -3,7 +3,7 @@
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceApacheHttpClientImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceApacheHttpClientImpl.java
index d181af6749..076d0205a5 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceApacheHttpClientImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceApacheHttpClientImpl.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.cp.api.impl;
 
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java
index d886d31530..e78432b5a2 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.cp.api.impl;
 
 import com.google.gson.JsonObject;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceJoddHttpImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceJoddHttpImpl.java
index 6aff7ed530..1b53630688 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceJoddHttpImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceJoddHttpImpl.java
@@ -5,7 +5,7 @@
 import jodd.http.HttpResponse;
 import jodd.http.ProxyInfo;
 import jodd.http.net.SocketHttpConnectionProvider;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceOkHttpImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceOkHttpImpl.java
index 596dc0608e..5fb5a73756 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceOkHttpImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceOkHttpImpl.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.cp.api.impl;
 
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java
index 43df12657d..cdc6b2cfc0 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java
@@ -2,7 +2,7 @@
 
 
 import com.google.gson.JsonObject;
-import me.chanjar.weixin.common.WxType;
+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.HttpType;
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 19f9d36e99..86b18529ad 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
@@ -8,7 +8,7 @@
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.error.WxError;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
index d819ff8054..3a36a3c75a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
@@ -10,7 +10,7 @@
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import lombok.AllArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
index a5238ef086..3c5abc8781 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
@@ -8,7 +8,7 @@
 import com.google.gson.JsonObject;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
index 50747a8206..3d37d9dbe4 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
@@ -7,7 +7,7 @@
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
 import lombok.AllArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java
index 0bddb0ff64..8106dcd6c7 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java
@@ -5,7 +5,7 @@
 import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.ocr.*;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor;
+import me.chanjar.weixin.common.requestexecuter.ocr.OcrDiscernRequestExecutor;
 
 import java.io.File;
 import java.io.UnsupportedEncodingException;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
index aa3293961e..bd473fb21c 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
@@ -1,7 +1,7 @@
 package cn.binarywang.wx.miniapp.util;
 
 import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
-import me.chanjar.weixin.common.WxType;
+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.RequestExecutor;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeRequestExecutor.java
index dc0704b6a7..d3b764ff1a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeRequestExecutor.java
@@ -1,7 +1,7 @@
 package cn.binarywang.wx.miniapp.util;
 
 import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
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 43fd2fd2b6..ba35746db2 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
@@ -7,7 +7,7 @@
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
index 831fc2a4ce..9c9bbe84c4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+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;
@@ -23,7 +23,6 @@
  */
 @RequiredArgsConstructor
 public class WxMpAiOpenServiceImpl implements WxMpAiOpenService {
-
   private final WxMpService wxMpService;
 
   @Override
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java
index 8f59a8f160..5f1195527e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java
@@ -7,7 +7,7 @@
 import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult;
 import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult;
 import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult;
-import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor;
+import me.chanjar.weixin.common.requestexecuter.ocr.OcrDiscernRequestExecutor;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.File;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
index bf37f2c414..45e1c5c4b1 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.api.WxConsts;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.error.WxError;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java
index 6cd8cf1462..f6748b5641 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java
@@ -10,7 +10,7 @@
 import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingLicenseResult;
 import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingResult;
 import me.chanjar.weixin.common.bean.ocr.WxOcrIdCardResult;
-import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor;
+import me.chanjar.weixin.common.requestexecuter.ocr.OcrDiscernRequestExecutor;
 
 import java.io.File;
 import java.io.UnsupportedEncodingException;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpShakeServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpShakeServiceImpl.java
index 95efcb7f5c..95c9fd79fd 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpShakeServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpShakeServiceImpl.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+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.mp.api.WxMpService;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
index 58b48e9c7a..e1378efc5c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
@@ -3,7 +3,7 @@
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+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.BeanUtils;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
index f2da7571f7..c4120022e1 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
@@ -2,7 +2,7 @@
 
 import com.google.gson.JsonObject;
 import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
index 1d2013fd3f..007942f096 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
@@ -4,7 +4,7 @@
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import lombok.RequiredArgsConstructor;
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
index 8274d40076..72fcaf1b3f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
index df6ecfb507..afc99d62c0 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
@@ -6,7 +6,7 @@
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
index 15064413dd..87d8c3df93 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import com.google.common.collect.ImmutableMap;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
index 7a2deb6c6e..18e696938b 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
@@ -2,7 +2,7 @@
 
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
index 239dc2327d..d1326429df 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import com.google.common.collect.ImmutableMap;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
index 6f30d02208..59f0710692 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
@@ -7,7 +7,7 @@
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
index 9a0b2c68b2..abee9055af 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
@@ -2,7 +2,7 @@
 
 import com.google.common.collect.ImmutableMap;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
index 3dfa2af625..41374809c6 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
@@ -2,7 +2,7 @@
 
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
index c63301a46f..a89687cd22 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
index dc8381464d..7699f2f202 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
@@ -6,7 +6,7 @@
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
index 9f034def9c..f4654f9fb1 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
index 92c6effa26..9044d052a8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
@@ -2,7 +2,7 @@
 
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
index 13f33bde04..7034379fbe 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
index 08a07f3416..f142c21788 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
@@ -6,7 +6,7 @@
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
index b626fe930a..2e38ab003b 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import com.google.common.collect.ImmutableMap;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
index bf4c41cd72..5ea6fae0b2 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
@@ -3,7 +3,7 @@
 
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
index cecfdec861..3c08b1346c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
index 2a86b369a0..1a4c25590c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
@@ -6,7 +6,7 @@
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
index 39869b6cbb..217ae3d215 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
@@ -1,7 +1,7 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import com.google.common.collect.ImmutableMap;
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
index 4a27602de6..b482ddbcd1 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
@@ -4,7 +4,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
index 4176bad11b..989e388632 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.media;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
index 6fad6d462f..76c625141e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
@@ -6,7 +6,7 @@
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
index 78bb14f3a1..27677b74b4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.media;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
index bbb2871ec2..b5f42e0f8d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
@@ -3,7 +3,7 @@
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
index 8244761e8b..2c8e5b5721 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.qrcode;
 
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeJoddHttpRequestExecutor.java
index 2cbbc20e24..99621843db 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeJoddHttpRequestExecutor.java
@@ -7,7 +7,7 @@
 import jodd.net.MimeTypes;
 import jodd.util.StringPool;
 
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeOkhttpRequestExecutor.java
index 61be36ea92..e6992e1e5e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeOkhttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.qrcode;
 
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeRequestExecutor.java
index e7d771800e..0a65d2abc7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeRequestExecutor.java
@@ -3,7 +3,7 @@
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+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.RequestExecutor;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
index c507d5fddb..3c733a126f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.voice;
 
-import me.chanjar.weixin.common.WxType;
+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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
index a2be94cd60..fa48c953f6 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
@@ -3,7 +3,7 @@
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
index e4e66890b3..eb4ffbfb2b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.open.api.impl;
 
-import me.chanjar.weixin.common.WxType;
+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.RequestExecutor;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeApacheHttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeApacheHttpRequestExecutor.java
index 8641768606..7f9b7694e5 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeApacheHttpRequestExecutor.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeApacheHttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.open.executor;
 
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeJoddHttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeJoddHttpRequestExecutor.java
index c06fbafa74..7f24674d9f 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeJoddHttpRequestExecutor.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeJoddHttpRequestExecutor.java
@@ -6,7 +6,7 @@
 import jodd.http.ProxyInfo;
 import jodd.net.MimeTypes;
 import jodd.util.StringPool;
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
index cdc05af72e..4b8a754502 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.open.executor;
 
-import me.chanjar.weixin.common.WxType;
+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.fs.FileUtils;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeRequestExecutor.java
index 5f13a46e35..dfaec08565 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeRequestExecutor.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeRequestExecutor.java
@@ -3,7 +3,7 @@
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.WxType;
+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.RequestExecutor;

From 14dfe30bf6a54b3c17a8c73796bc5a5ab3dfc368 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 8 Aug 2020 17:14:09 +0800
Subject: [PATCH 67/90] =?UTF-8?q?:new:=20#1685=20=E5=B0=8F=E7=A8=8B?=
 =?UTF-8?q?=E5=BA=8F=E5=A2=9E=E5=8A=A0=E5=9B=BE=E5=83=8F=E5=A4=84=E7=90=86?=
 =?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

---
 .../weixin/common/api/WxImgProcService.java   |  26 ++--
 .../bean/imgproc/WxImgProcAiCropResult.java   |  29 ++--
 .../bean/imgproc/WxImgProcQrCodeResult.java   |  40 ++++--
 .../WxImgProcSuperResolutionResult.java       |  28 ++++
 .../wx/miniapp/api/WxMaService.java           |   9 ++
 .../miniapp/api/impl/BaseWxMaServiceImpl.java |   7 +
 .../api/impl/WxMaImgProcServiceImpl.java      | 131 ++++++++++++++++++
 .../me/chanjar/weixin/mp/api/WxMpService.java |   7 +-
 .../mp/api/impl/BaseWxMpServiceImpl.java      |   7 +-
 .../mp/api/impl/WxMpImgProcServiceImpl.java   |  53 +++----
 .../WxMpImgProcSuperResolutionResult.java     |  28 ----
 .../api/impl/WxMpImgProcServiceImplTest.java  |  36 ++---
 12 files changed, 287 insertions(+), 114 deletions(-)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxImgProcService.java (81%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcAiCropResult.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcAiCropResult.java (54%)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcQrCodeResult.java => weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcQrCodeResult.java (67%)
 create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcSuperResolutionResult.java
 create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaImgProcServiceImpl.java
 delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcSuperResolutionResult.java

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxImgProcService.java
similarity index 81%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java
rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxImgProcService.java
index 63cea28e72..c7d1bcfc14 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxImgProcService.java
@@ -1,9 +1,9 @@
-package me.chanjar.weixin.mp.api;
+package me.chanjar.weixin.common.api;
 
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcAiCropResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcQrCodeResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcSuperResolutionResult;
 
 import java.io.File;
 
@@ -13,7 +13,7 @@
  *
  * @author Theo Nie
  */
-public interface WxMpImgProcService {
+public interface WxImgProcService {
 
   /**
    * 二维码/条码识别接口
@@ -27,7 +27,7 @@ public interface WxMpImgProcService {
    * @return WxMpImgProcQrCodeResult
    * @throws WxErrorException .
    */
-  WxMpImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException;
+  WxImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException;
 
   /**
    * 二维码/条码识别接口
@@ -41,7 +41,7 @@ public interface WxMpImgProcService {
    * @return WxMpImgProcQrCodeResult
    * @throws WxErrorException .
    */
-  WxMpImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException;
+  WxImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException;
 
   /**
    * 图片高清化接口
@@ -55,7 +55,7 @@ public interface WxMpImgProcService {
    * @return WxMpImgProcSuperResolutionResult
    * @throws WxErrorException .
    */
-  WxMpImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException;
+  WxImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException;
 
   /**
    * 图片高清化接口
@@ -69,7 +69,7 @@ public interface WxMpImgProcService {
    * @return WxMpImgProcSuperResolutionResult
    * @throws WxErrorException .
    */
-  WxMpImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException;
+  WxImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException;
 
   /**
    * 图片智能裁剪接口
@@ -81,7 +81,7 @@ public interface WxMpImgProcService {
    * @return WxMpImgProcAiCropResult
    * @throws WxErrorException .
    */
-  WxMpImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException;
+  WxImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException;
 
   /**
    * 图片智能裁剪接口
@@ -93,7 +93,7 @@ public interface WxMpImgProcService {
    * @return WxMpImgProcAiCropResult
    * @throws WxErrorException .
    */
-  WxMpImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException;
+  WxImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException;
 
   /**
    * 图片智能裁剪接口
@@ -105,7 +105,7 @@ public interface WxMpImgProcService {
    * @return WxMpImgProcAiCropResult
    * @throws WxErrorException .
    */
-  WxMpImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException;
+  WxImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException;
 
   /**
    * 图片智能裁剪接口
@@ -117,5 +117,5 @@ public interface WxMpImgProcService {
    * @return WxMpImgProcAiCropResult
    * @throws WxErrorException .
    */
-  WxMpImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException;
+  WxImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException;
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcAiCropResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcAiCropResult.java
similarity index 54%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcAiCropResult.java
rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcAiCropResult.java
index ef25670d9a..4cfc514d70 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcAiCropResult.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcAiCropResult.java
@@ -1,8 +1,8 @@
-package me.chanjar.weixin.mp.bean.imgproc;
+package me.chanjar.weixin.common.bean.imgproc;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 import java.util.List;
@@ -11,50 +11,59 @@
  * @author Theo Nie
  */
 @Data
-public class WxMpImgProcAiCropResult implements Serializable {
+public class WxImgProcAiCropResult implements Serializable {
   private static final long serialVersionUID = -6470673963772979463L;
 
   @SerializedName("img_size")
   private ImgSize imgSize;
+
   @SerializedName("results")
   private List results;
 
   @Override
   public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
+    return WxGsonBuilder.create().toJson(this);
   }
 
-  public static WxMpImgProcAiCropResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcAiCropResult.class);
+  public static WxImgProcAiCropResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxImgProcAiCropResult.class);
   }
 
   @Data
-  public static class ImgSize {
+  public static class ImgSize implements Serializable {
+    private static final long serialVersionUID = -6470673963772979463L;
+
     @SerializedName("w")
     private int w;
+
     @SerializedName("h")
     private int h;
 
     @Override
     public String toString() {
-      return WxMpGsonBuilder.create().toJson(this);
+      return WxGsonBuilder.create().toJson(this);
     }
   }
 
   @Data
-  public static class Results {
+  public static class Results implements Serializable {
+    private static final long serialVersionUID = -6470673963772979463L;
+
     @SerializedName("crop_left")
     private int cropLeft;
+
     @SerializedName("crop_top")
     private int cropTop;
+
     @SerializedName("crop_right")
     private int cropRight;
+
     @SerializedName("crop_bottom")
     private int cropBottom;
 
     @Override
     public String toString() {
-      return WxMpGsonBuilder.create().toJson(this);
+      return WxGsonBuilder.create().toJson(this);
     }
   }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcQrCodeResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcQrCodeResult.java
similarity index 67%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcQrCodeResult.java
rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcQrCodeResult.java
index a897e7f601..c257146092 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcQrCodeResult.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcQrCodeResult.java
@@ -1,28 +1,31 @@
-package me.chanjar.weixin.mp.bean.imgproc;
+package me.chanjar.weixin.common.bean.imgproc;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 import java.util.List;
 
 /**
  * 二维码/条码识别返回结果
+ *
  * @author Theo Nie
  */
 @Data
-public class WxMpImgProcQrCodeResult implements Serializable {
-
+public class WxImgProcQrCodeResult implements Serializable {
   private static final long serialVersionUID = -1194154790100866123L;
+
   @SerializedName("img_size")
   private ImgSize imgSize;
+
   @SerializedName("code_results")
   private List codeResults;
 
   @Data
-  public static class ImgSize implements Serializable{
+  public static class ImgSize implements Serializable {
     private static final long serialVersionUID = -8847603245514017839L;
+
     @SerializedName("w")
     private int w;
     @SerializedName("h")
@@ -30,64 +33,71 @@ public static class ImgSize implements Serializable{
 
     @Override
     public String toString() {
-      return WxMpGsonBuilder.create().toJson(this);
+      return WxGsonBuilder.create().toJson(this);
     }
   }
 
   @Data
-  public static class CodeResults implements Serializable{
+  public static class CodeResults implements Serializable {
     private static final long serialVersionUID = -6138135951229076759L;
+
     @SerializedName("type_name")
     private String typeName;
+
     @SerializedName("data")
     private String data;
+
     @SerializedName("pos")
     private Pos pos;
 
     @Override
     public String toString() {
-      return WxMpGsonBuilder.create().toJson(this);
+      return WxGsonBuilder.create().toJson(this);
     }
 
     @Data
-    public static class Pos implements Serializable{
+    public static class Pos implements Serializable {
       private static final long serialVersionUID = 7754894061212819602L;
       @SerializedName("left_top")
       private Coordinate leftTop;
+
       @SerializedName("right_top")
       private Coordinate rightTop;
+
       @SerializedName("right_bottom")
       private Coordinate rightBottom;
+
       @SerializedName("left_bottom")
       private Coordinate leftBottom;
 
       @Override
       public String toString() {
-        return WxMpGsonBuilder.create().toJson(this);
+        return WxGsonBuilder.create().toJson(this);
       }
 
       @Data
-      public static class Coordinate implements Serializable{
+      public static class Coordinate implements Serializable {
         private static final long serialVersionUID = 8930443668927359677L;
         @SerializedName("x")
         private int x;
+
         @SerializedName("y")
         private int y;
 
         @Override
         public String toString() {
-          return WxMpGsonBuilder.create().toJson(this);
+          return WxGsonBuilder.create().toJson(this);
         }
       }
     }
   }
 
-  public static WxMpImgProcQrCodeResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcQrCodeResult.class);
+  public static WxImgProcQrCodeResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxImgProcQrCodeResult.class);
   }
 
   @Override
   public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
+    return WxGsonBuilder.create().toJson(this);
   }
 }
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcSuperResolutionResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcSuperResolutionResult.java
new file mode 100644
index 0000000000..2ce5d3829f
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/imgproc/WxImgProcSuperResolutionResult.java
@@ -0,0 +1,28 @@
+package me.chanjar.weixin.common.bean.imgproc;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 图片高清化返回结果
+ * @author Theo Nie
+ */
+@Data
+public class WxImgProcSuperResolutionResult implements Serializable {
+  private static final long serialVersionUID = 8007440280170407021L;
+
+  @SerializedName("media_id")
+  private String mediaId;
+
+  @Override
+  public String toString() {
+    return WxGsonBuilder.create().toJson(this);
+  }
+
+  public static WxImgProcSuperResolutionResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxImgProcSuperResolutionResult.class);
+  }
+}
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 c7de9cc472..f73d918997 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
@@ -2,6 +2,7 @@
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import me.chanjar.weixin.common.api.WxImgProcService;
 import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.service.WxService;
@@ -295,4 +296,12 @@ public interface WxMaService extends WxService {
    * @return 。
    */
   WxOcrService getOcrService();
+
+  /**
+   * 返回图像处理接口的实现类对象,以方便调用其各个接口.
+   *
+   * @return WxImgProcService
+   */
+  WxImgProcService getImgProcService();
+
 }
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 86b18529ad..6e7b04da19 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
@@ -8,6 +8,7 @@
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.api.WxImgProcService;
 import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxAccessToken;
@@ -59,6 +60,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
   private final WxMaLiveService liveService = new WxMaLiveServiceImpl(this);
   private final WxMaLiveGoodsService liveGoodsService = new WxMaLiveGoodsServiceImpl(this);
   private final WxOcrService ocrService = new WxMaOcrServiceImpl(this);
+  private final WxImgProcService imgProcService = new WxMaImgProcServiceImpl(this);
 
   private int retrySleepMillis = 1000;
   private int maxRetryTimes = 5;
@@ -408,4 +410,9 @@ public WxOcrService getOcrService() {
     return this.ocrService;
   }
 
+  @Override
+  public WxImgProcService getImgProcService() {
+    return this.imgProcService;
+  }
+
 }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaImgProcServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaImgProcServiceImpl.java
new file mode 100644
index 0000000000..0499b7c7e0
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaImgProcServiceImpl.java
@@ -0,0 +1,131 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.common.api.WxImgProcService;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcAiCropResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcQrCodeResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcSuperResolutionResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.requestexecuter.ocr.OcrDiscernRequestExecutor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+
+/**
+ * 图像处理接口实现.
+ *
+ * @author Theo Nie
+ */
+@RequiredArgsConstructor
+public class WxMaImgProcServiceImpl implements WxImgProcService {
+  /**
+   * 二维码/条码识别
+   */
+  private static final String QRCODE = "/cv/img/qrcode?img_url=%s";
+
+  /**
+   * 二维码/条码识别(文件)
+   */
+  private static final String FILE_QRCODE = "/cv/img/qrcode";
+
+  /**
+   * 图片高清化
+   */
+  private static final String SUPER_RESOLUTION = "/cv/img/superresolution?img_url=%s";
+
+  /**
+   * 图片高清化(文件)
+   */
+  private static final String FILE_SUPER_RESOLUTION = "/cv/img/superresolution";
+
+  /**
+   * 图片智能裁剪
+   */
+  private static final String AI_CROP = "/cv/img/aicrop?img_url=%s&ratios=%s";
+
+  /**
+   * 图片智能裁剪(文件)
+   */
+  private static final String FILE_AI_CROP = "/cv/img/aicrop?ratios=%s";
+  private final WxMaService service;
+
+  @Override
+  public WxImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      //ignore
+    }
+
+    final String result = this.service.get(String.format(QRCODE, imgUrl), null);
+    return WxImgProcQrCodeResult.fromJson(result);
+  }
+
+  @Override
+  public WxImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException {
+    String result = this.service.execute(OcrDiscernRequestExecutor.create(this.service.getRequestHttp()),
+      FILE_QRCODE, imgFile);
+    return WxImgProcQrCodeResult.fromJson(result);
+  }
+
+  @Override
+  public WxImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      //ignore
+    }
+
+    final String result = this.service.get(String.format(SUPER_RESOLUTION, imgUrl), null);
+    return WxImgProcSuperResolutionResult.fromJson(result);
+  }
+
+  @Override
+  public WxImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException {
+    String result = this.service.execute(OcrDiscernRequestExecutor.create(this.service.getRequestHttp()),
+      FILE_SUPER_RESOLUTION, imgFile);
+    return WxImgProcSuperResolutionResult.fromJson(result);
+  }
+
+  @Override
+  public WxImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException {
+    return this.aiCrop(imgUrl, "");
+  }
+
+  @Override
+  public WxImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      //ignore
+    }
+
+    if (StringUtils.isEmpty(ratios)) {
+      ratios = "";
+    }
+
+    final String result = this.service.get(String.format(AI_CROP, imgUrl, ratios), null);
+    return WxImgProcAiCropResult.fromJson(result);
+  }
+
+  @Override
+  public WxImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException {
+    return this.aiCrop(imgFile, "");
+  }
+
+  @Override
+  public WxImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException {
+    if (StringUtils.isEmpty(ratios)) {
+      ratios = "";
+    }
+
+    String result = this.service.execute(OcrDiscernRequestExecutor.create(this.service.getRequestHttp()),
+      String.format(FILE_AI_CROP, ratios), imgFile);
+    return WxImgProcAiCropResult.fromJson(result);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
index a1841bff1d..2418a31488 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
@@ -1,5 +1,6 @@
 package me.chanjar.weixin.mp.api;
 
+import me.chanjar.weixin.common.api.WxImgProcService;
 import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
 import me.chanjar.weixin.common.bean.WxNetCheckResult;
@@ -561,9 +562,9 @@ public interface WxMpService extends WxService {
   /**
    * 返回图像处理接口的实现类对象,以方便调用其各个接口.
    *
-   * @return WxMpImgProcService
+   * @return WxImgProcService
    */
-  WxMpImgProcService getImgProcService();
+  WxImgProcService getImgProcService();
 
   /**
    * .
@@ -696,7 +697,7 @@ public interface WxMpService extends WxService {
    *
    * @param imgProcService .
    */
-  void setImgProcService(WxMpImgProcService imgProcService);
+  void setImgProcService(WxImgProcService imgProcService);
 
   /**
    * 返回评论数据管理接口方法的实现类对象,以方便调用其各个接口.
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
index ba35746db2..9aedcf0af5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
@@ -7,6 +7,7 @@
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.api.WxImgProcService;
 import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxAccessToken;
@@ -71,7 +72,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
   private WxMpMarketingService marketingService = new WxMpMarketingServiceImpl(this);
   private WxMpCommentService commentService = new WxMpCommentServiceImpl(this);
   private WxOcrService ocrService = new WxMpOcrServiceImpl(this);
-  private WxMpImgProcService imgProcService = new WxMpImgProcServiceImpl(this);
+  private WxImgProcService imgProcService = new WxMpImgProcServiceImpl(this);
 
   @Getter
   @Setter
@@ -696,12 +697,12 @@ public void setCommentService(WxMpCommentService commentService) {
   }
 
   @Override
-  public WxMpImgProcService getImgProcService() {
+  public WxImgProcService getImgProcService() {
     return this.imgProcService;
   }
 
   @Override
-  public void setImgProcService(WxMpImgProcService imgProcService) {
+  public void setImgProcService(WxImgProcService imgProcService) {
     this.imgProcService = imgProcService;
   }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java
index 5f1195527e..24c699657d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java
@@ -2,11 +2,11 @@
 
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.WxMpImgProcService;
+import me.chanjar.weixin.common.api.WxImgProcService;
 import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcAiCropResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcQrCodeResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcSuperResolutionResult;
 import me.chanjar.weixin.common.requestexecuter.ocr.OcrDiscernRequestExecutor;
 import org.apache.commons.lang3.StringUtils;
 
@@ -27,29 +27,31 @@
  * @author Theo Nie
  */
 @RequiredArgsConstructor
-public class WxMpImgProcServiceImpl implements WxMpImgProcService {
+public class WxMpImgProcServiceImpl implements WxImgProcService {
   private final WxMpService wxMpService;
 
   @Override
-  public WxMpImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException {
+  public WxImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
       //ignore
     }
 
-    final String result = this.wxMpService.get(String.format(QRCODE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl), null);
-    return WxMpImgProcQrCodeResult.fromJson(result);
+    String result = this.wxMpService.get(String.format(QRCODE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl),
+      null);
+    return WxImgProcQrCodeResult.fromJson(result);
   }
 
   @Override
-  public WxMpImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException {
-    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_QRCODE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
-    return WxMpImgProcQrCodeResult.fromJson(result);
+  public WxImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException {
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()),
+      FILE_QRCODE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
+    return WxImgProcQrCodeResult.fromJson(result);
   }
 
   @Override
-  public WxMpImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException {
+  public WxImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -57,22 +59,23 @@ public WxMpImgProcSuperResolutionResult superResolution(String imgUrl) throws Wx
     }
 
     final String result = this.wxMpService.get(String.format(SUPER_RESOLUTION.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl), null);
-    return WxMpImgProcSuperResolutionResult.fromJson(result);
+    return WxImgProcSuperResolutionResult.fromJson(result);
   }
 
   @Override
-  public WxMpImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException {
-    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_SUPER_RESOLUTION.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
-    return WxMpImgProcSuperResolutionResult.fromJson(result);
+  public WxImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException {
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()),
+      FILE_SUPER_RESOLUTION.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
+    return WxImgProcSuperResolutionResult.fromJson(result);
   }
 
   @Override
-  public WxMpImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException {
+  public WxImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException {
     return this.aiCrop(imgUrl, "");
   }
 
   @Override
-  public WxMpImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException {
+  public WxImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -83,22 +86,24 @@ public WxMpImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErr
       ratios = "";
     }
 
-    final String result = this.wxMpService.get(String.format(AI_CROP.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl, ratios), null);
-    return WxMpImgProcAiCropResult.fromJson(result);
+    final String result = this.wxMpService.get(String.format(AI_CROP.getUrl(this.wxMpService.getWxMpConfigStorage()),
+      imgUrl, ratios), null);
+    return WxImgProcAiCropResult.fromJson(result);
   }
 
   @Override
-  public WxMpImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException {
+  public WxImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException {
     return this.aiCrop(imgFile, "");
   }
 
   @Override
-  public WxMpImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException {
+  public WxImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException {
     if (StringUtils.isEmpty(ratios)) {
       ratios = "";
     }
 
-    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), String.format(FILE_AI_CROP.getUrl(this.wxMpService.getWxMpConfigStorage()), ratios), imgFile);
-    return WxMpImgProcAiCropResult.fromJson(result);
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()),
+      String.format(FILE_AI_CROP.getUrl(this.wxMpService.getWxMpConfigStorage()), ratios), imgFile);
+    return WxImgProcAiCropResult.fromJson(result);
   }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcSuperResolutionResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcSuperResolutionResult.java
deleted file mode 100644
index b9d78f4f29..0000000000
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcSuperResolutionResult.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package me.chanjar.weixin.mp.bean.imgproc;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-
-import java.io.Serializable;
-
-/**
- * 图片高清化返回结果
- * @author Theo Nie
- */
-@Data
-public class WxMpImgProcSuperResolutionResult implements Serializable {
-
-  private static final long serialVersionUID = 8007440280170407021L;
-  @SerializedName("media_id")
-  private String mediaId;
-
-  @Override
-  public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
-  }
-
-  public static WxMpImgProcSuperResolutionResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcSuperResolutionResult.class);
-  }
-}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java
index 37f6ab7222..4d2c21bce9 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java
@@ -2,13 +2,13 @@
 
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.fs.FileUtils;
-import me.chanjar.weixin.mp.api.WxMpImgProcService;
+import me.chanjar.weixin.common.api.WxImgProcService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.test.ApiTestModule;
 import me.chanjar.weixin.mp.api.test.TestConstants;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult;
-import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcAiCropResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcQrCodeResult;
+import me.chanjar.weixin.common.bean.imgproc.WxImgProcSuperResolutionResult;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
@@ -29,7 +29,7 @@ public class WxMpImgProcServiceImplTest {
 
   @Test
   public void testQrCode() throws WxErrorException {
-    final WxMpImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
+    final WxImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -38,14 +38,14 @@ public void testQrCode() throws WxErrorException {
   public void testQrCode2() throws Exception {
     InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode(tempFile);
+    final WxImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
   @Test
   public void testSuperResolution() throws WxErrorException {
-    final WxMpImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
+    final WxImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -54,21 +54,21 @@ public void testSuperResolution() throws WxErrorException {
   public void testSuperResolution2() throws Exception {
     InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution(tempFile);
+    final WxImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
   @Test
   public void testAiCrop() throws WxErrorException {
-    final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
+    final WxImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
   @Test
   public void testAiCrop2() throws WxErrorException {
-    final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png", "1,2.35");
+    final WxImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png", "1,2.35");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -77,7 +77,7 @@ public void testAiCrop2() throws WxErrorException {
   public void testAiCrop3() throws Exception {
     InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile);
+    final WxImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -86,7 +86,7 @@ public void testAiCrop3() throws Exception {
   public void testAiCrop4() throws Exception {
     InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile, "1,2.35,3.5");
+    final WxImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile, "1,2.35,3.5");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -159,8 +159,8 @@ public void testQrCode() throws Exception {
         "    }\n" +
         "}";
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
-      final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
-      final WxMpImgProcQrCodeResult result = wxMpImgProcService.qrCode("abc");
+      final WxImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
+      final WxImgProcQrCodeResult result = wxMpImgProcService.qrCode("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }
@@ -173,8 +173,8 @@ public void testSuperResolution() throws Exception {
         "    \"media_id\": \"6WXsIXkG7lXuDLspD9xfm5dsvHzb0EFl0li6ySxi92ap8Vl3zZoD9DpOyNudeJGB\"\n" +
         "}";
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
-      final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
-      final WxMpImgProcSuperResolutionResult result = wxMpImgProcService.superResolution("abc");
+      final WxImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
+      final WxImgProcSuperResolutionResult result = wxMpImgProcService.superResolution("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }
@@ -204,8 +204,8 @@ public void testAiCrop() throws Exception {
         "    }\n" +
         "}";
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
-      final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
-      final WxMpImgProcAiCropResult result = wxMpImgProcService.aiCrop("abc");
+      final WxImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
+      final WxImgProcAiCropResult result = wxMpImgProcService.aiCrop("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }

From 4bd5b3cf56458fc27f8e3d646ccd1fb43b811958 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 8 Aug 2020 17:29:00 +0800
Subject: [PATCH 68/90] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E4=BB=A3?=
 =?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../open/api/impl/WxOpenInMemoryConfigStorage.java  | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java
index a4859ba18c..13f4b48a42 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java
@@ -235,8 +235,10 @@ private static class Token {
   }
 
   private static class WxOpenInnerConfigStorage implements WxMpConfigStorage, WxMaConfig {
-    private WxOpenConfigStorage wxOpenConfigStorage;
-    private String appId;
+    private final WxOpenConfigStorage wxOpenConfigStorage;
+    private final String appId;
+    private WxMpHostConfig hostConfig;
+
     /**
      * 小程序原始ID
      */
@@ -527,7 +529,12 @@ public boolean autoRefreshToken() {
 
     @Override
     public WxMpHostConfig getHostConfig() {
-      return null;
+      return this.hostConfig;
+    }
+
+    @Override
+    public void setHostConfig(WxMpHostConfig hostConfig) {
+      this.hostConfig = hostConfig;
     }
   }
 }

From 9346c170ca3c8aa2bbc8de5aef396d3021a2f748 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 9 Aug 2020 19:52:54 +0800
Subject: [PATCH 69/90] =?UTF-8?q?:art:=20=E6=8A=BD=E5=8F=96oauth2=E7=9B=B8?=
 =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3=E6=96=B9=E6=B3=95=E5=88=B0=E7=8B=AC?=
 =?UTF-8?q?=E7=AB=8B=E7=B1=BBWxOAuth2Service=E4=B8=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../me/chanjar/weixin/mp/api/WxMpService.java |  55 +++-
 .../weixin/mp/api/WxOAuth2Service.java        |  72 +++++
 .../mp/api/impl/BaseWxMpServiceImpl.java      | 302 ++++--------------
 .../mp/api/impl/WxOAuth2ServiceImpl.java      |  95 ++++++
 .../mp/api/impl/WxOAuth2ServiceImplTest.java  |  47 +++
 5 files changed, 311 insertions(+), 260 deletions(-)
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxOAuth2Service.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxOAuth2ServiceImpl.java
 create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxOAuth2ServiceImplTest.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 2418a31488..e9376368e7 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
@@ -4,6 +4,7 @@
 import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
 import me.chanjar.weixin.common.bean.WxNetCheckResult;
+import me.chanjar.weixin.common.enums.TicketType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.service.WxService;
 import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
@@ -15,7 +16,6 @@
 import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
 import me.chanjar.weixin.mp.config.WxMpConfigStorage;
-import me.chanjar.weixin.common.enums.TicketType;
 import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 
 import java.util.Map;
@@ -32,9 +32,9 @@ public interface WxMpService extends WxService {
    * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319&token=&lang=zh_CN
    * 
* + * @param timestamp 时间戳 * @param nonce 随机串 * @param signature 签名 - * @param timestamp 时间戳 * @return 是否验证通过 */ boolean checkSignature(String timestamp, String nonce, String signature); @@ -82,8 +82,8 @@ public interface WxMpService extends WxService { * 获得时会检查 Token是否过期,如果过期了,那么就刷新一下,否则就什么都不干 *
* - * @param forceRefresh 强制刷新 * @param type ticket类型 + * @param forceRefresh 强制刷新 * @return ticket * @throws WxErrorException . */ @@ -156,12 +156,12 @@ public interface WxMpService extends WxService { * URL格式为:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect *
* - * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode + * @param redirectUri 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可 * @param state 非必填,用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 - * @return url + * @return url string */ - String buildQrConnectUrl(String redirectURI, String scope, String state); + String buildQrConnectUrl(String redirectUri, String scope, String state); /** *
@@ -172,8 +172,10 @@ public interface WxMpService extends WxService {
    * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode
    * @param scope       scope
    * @param state       state
-   * @return url
+   * @return url string
+   * @deprecated use oauth2Service.buildAuthorizationUrl() instead
    */
+  @Deprecated
   String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state);
 
   /**
@@ -186,6 +188,7 @@ public interface WxMpService extends WxService {
    * @return token对象
    * @throws WxErrorException .
    */
+  @Deprecated
   WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException;
 
   /**
@@ -197,6 +200,7 @@ public interface WxMpService extends WxService {
    * @return 新的token对象
    * @throws WxErrorException .
    */
+  @Deprecated
   WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException;
 
   /**
@@ -209,6 +213,7 @@ public interface WxMpService extends WxService {
    * @return 用户对象
    * @throws WxErrorException .
    */
+  @Deprecated
   WxMpUser oauth2getUserInfo(WxMpOAuth2AccessToken oAuth2AccessToken, String lang) throws WxErrorException;
 
   /**
@@ -219,6 +224,7 @@ public interface WxMpService extends WxService {
    * @param oAuth2AccessToken token对象
    * @return 是否有效
    */
+  @Deprecated
   boolean oauth2validateAccessToken(WxMpOAuth2AccessToken oAuth2AccessToken);
 
   /**
@@ -276,6 +282,7 @@ public interface WxMpService extends WxService {
    * 
* * @param appid 公众号的APPID + * @throws WxErrorException the wx error exception */ void clearQuota(String appid) throws WxErrorException; @@ -286,9 +293,11 @@ public interface WxMpService extends WxService { * 可以参考,{@link MediaUploadRequestExecutor}的实现方法 *
* - * @param data 参数数据 + * @param the type parameter + * @param the type parameter * @param executor 执行器 * @param url 接口地址 + * @param data 参数数据 * @return 结果 * @throws WxErrorException 异常 */ @@ -297,8 +306,8 @@ public interface WxMpService extends WxService { /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求. * - * @param queryParam 参数 * @param url 请求接口地址 + * @param queryParam 参数 * @return 接口响应字符串 * @throws WxErrorException 异常 */ @@ -307,8 +316,8 @@ public interface WxMpService extends WxService { /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求. * - * @param postData 请求参数json值 * @param url 请求接口地址 + * @param postData 请求参数json值 * @return 接口响应字符串 * @throws WxErrorException 异常 */ @@ -321,9 +330,11 @@ public interface WxMpService extends WxService { * 可以参考,{@link MediaUploadRequestExecutor}的实现方法 *
* - * @param data 参数数据 + * @param the type parameter + * @param the type parameter * @param executor 执行器 * @param url 接口地址 + * @param data 参数数据 * @return 结果 * @throws WxErrorException 异常 */ @@ -597,16 +608,16 @@ public interface WxMpService extends WxService { /** * . * - * @param tagService . + * @param userTagService . */ - void setTagService(WxMpUserTagService tagService); + void setUserTagService(WxMpUserTagService userTagService); /** * . * - * @param qrCodeService . + * @param qrcodeService . */ - void setQrCodeService(WxMpQrcodeService qrCodeService); + void setQrcodeService(WxMpQrcodeService qrcodeService); /** * . @@ -712,4 +723,18 @@ public interface WxMpService extends WxService { * @param commentService . */ void setCommentService(WxMpCommentService commentService); + + /** + * Gets oauth2 service. + * + * @return the oauth2 service + */ + WxOAuth2Service getOAuth2Service(); + + /** + * Sets oauth2Service. + * + * @param oAuth2Service the o auth 2 service + */ + void setOAuth2Service(WxOAuth2Service oAuth2Service); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxOAuth2Service.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxOAuth2Service.java new file mode 100644 index 0000000000..1fbb1f1a92 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxOAuth2Service.java @@ -0,0 +1,72 @@ +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; +import me.chanjar.weixin.mp.bean.result.WxMpUser; + +/** + * oauth2 相关接口. + * + * @author Binary Wang + * @date 2020-08-08 + */ +public interface WxOAuth2Service { + /** + *
+   * 构造oauth2授权的url连接.
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息
+   * 
+ * + * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode + * @param scope scope + * @param state state + * @return url + */ + String buildAuthorizationUrl(String redirectURI, String scope, String state); + + /** + *
+   * 用code换取oauth2的access token.
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息
+   * 
+ * + * @param code code + * @return token对象 + * @throws WxErrorException . + */ + WxMpOAuth2AccessToken getAccessToken(String code) throws WxErrorException; + + /** + *
+   * 刷新oauth2的access token.
+   * 
+ * + * @param refreshToken 刷新token + * @return 新的token对象 + * @throws WxErrorException . + */ + WxMpOAuth2AccessToken refreshAccessToken(String refreshToken) throws WxErrorException; + + /** + *
+   * 用oauth2获取用户信息, 当前面引导授权时的scope是snsapi_userinfo的时候才可以.
+   * 
+ * + * @param oAuth2AccessToken token对象 + * @param lang zh_CN, zh_TW, en + * @return 用户对象 + * @throws WxErrorException . + */ + WxMpUser getUserInfo(WxMpOAuth2AccessToken oAuth2AccessToken, String lang) throws WxErrorException; + + /** + *
+   * 验证oauth2的access token是否有效.
+   * 
+ * + * @param oAuth2AccessToken token对象 + * @return 是否有效 + */ + boolean validateAccessToken(WxMpOAuth2AccessToken oAuth2AccessToken); + +} 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 9aedcf0af5..ee861e0769 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java @@ -8,12 +8,12 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxImgProcService; -import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.WxNetCheckResult; import me.chanjar.weixin.common.enums.TicketType; +import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.session.StandardSessionManager; @@ -48,36 +48,81 @@ */ @Slf4j public abstract class BaseWxMpServiceImpl implements WxMpService, RequestHttp { - - protected WxSessionManager sessionManager = new StandardSessionManager(); + @Getter + @Setter private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this); + @Getter + @Setter private WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this); + @Getter + @Setter private WxMpMenuService menuService = new WxMpMenuServiceImpl(this); + @Getter + @Setter private WxMpUserService userService = new WxMpUserServiceImpl(this); - private WxMpUserTagService tagService = new WxMpUserTagServiceImpl(this); - private WxMpQrcodeService qrCodeService = new WxMpQrcodeServiceImpl(this); + @Getter + @Setter + private WxMpUserTagService userTagService = new WxMpUserTagServiceImpl(this); + @Getter + @Setter + private WxMpQrcodeService qrcodeService = new WxMpQrcodeServiceImpl(this); + @Getter + @Setter private WxMpCardService cardService = new WxMpCardServiceImpl(this); + @Getter + @Setter private WxMpStoreService storeService = new WxMpStoreServiceImpl(this); + @Getter + @Setter private WxMpDataCubeService dataCubeService = new WxMpDataCubeServiceImpl(this); + @Getter + @Setter private WxMpUserBlacklistService blackListService = new WxMpUserBlacklistServiceImpl(this); + @Getter + @Setter private WxMpTemplateMsgService templateMsgService = new WxMpTemplateMsgServiceImpl(this); + @Getter + @Setter private final WxMpSubscribeMsgService subscribeMsgService = new WxMpSubscribeMsgServiceImpl(this); + @Getter + @Setter private WxMpDeviceService deviceService = new WxMpDeviceServiceImpl(this); + @Getter + @Setter private WxMpShakeService shakeService = new WxMpShakeServiceImpl(this); + @Getter + @Setter private WxMpMemberCardService memberCardService = new WxMpMemberCardServiceImpl(this); + @Getter + @Setter private WxMpMassMessageService massMessageService = new WxMpMassMessageServiceImpl(this); + @Getter + @Setter private WxMpAiOpenService aiOpenService = new WxMpAiOpenServiceImpl(this); + @Getter + @Setter private final WxMpWifiService wifiService = new WxMpWifiServiceImpl(this); + @Getter + @Setter private WxMpMarketingService marketingService = new WxMpMarketingServiceImpl(this); + @Getter + @Setter private WxMpCommentService commentService = new WxMpCommentServiceImpl(this); + @Getter + @Setter private WxOcrService ocrService = new WxMpOcrServiceImpl(this); + @Getter + @Setter private WxImgProcService imgProcService = new WxMpImgProcServiceImpl(this); - @Getter @Setter private WxMpMerchantInvoiceService merchantInvoiceService = new WxMpMerchantInvoiceServiceImpl(this, this.cardService); + @Getter + @Setter + private WxOAuth2Service oAuth2Service = new WxOAuth2ServiceImpl(this); + private Map configStorageMap; private int retrySleepMillis = 1000; @@ -182,9 +227,9 @@ public String oauth2buildAuthorizationUrl(String redirectURI, String scope, Stri } @Override - public String buildQrConnectUrl(String redirectURI, String scope, String state) { + public String buildQrConnectUrl(String redirectUri, String scope, String state) { return String.format(QRCONNECT_URL.getUrl(this.getWxMpConfigStorage()), this.getWxMpConfigStorage().getAppId(), - URIUtil.encodeURIComponent(redirectURI), scope, StringUtils.trimToEmpty(state)); + URIUtil.encodeURIComponent(redirectUri), scope, StringUtils.trimToEmpty(state)); } private WxMpOAuth2AccessToken getOAuth2AccessToken(String url) throws WxErrorException { @@ -199,46 +244,22 @@ private WxMpOAuth2AccessToken getOAuth2AccessToken(String url) throws WxErrorExc @Override public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException { - String url = String.format(OAUTH2_ACCESS_TOKEN_URL.getUrl(this.getWxMpConfigStorage()), this.getWxMpConfigStorage().getAppId(), - this.getWxMpConfigStorage().getSecret(), code); - return this.getOAuth2AccessToken(url); + return this.oAuth2Service.getAccessToken(code); } @Override public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException { - String url = String.format(OAUTH2_REFRESH_TOKEN_URL.getUrl(this.getWxMpConfigStorage()), this.getWxMpConfigStorage().getAppId(), refreshToken); - return this.getOAuth2AccessToken(url); + return this.oAuth2Service.refreshAccessToken(refreshToken); } @Override public WxMpUser oauth2getUserInfo(WxMpOAuth2AccessToken token, String lang) throws WxErrorException { - if (lang == null) { - lang = "zh_CN"; - } - - String url = String.format(OAUTH2_USERINFO_URL.getUrl(this.getWxMpConfigStorage()), token.getAccessToken(), token.getOpenId(), lang); - - try { - RequestExecutor executor = SimpleGetRequestExecutor.create(this); - String responseText = executor.execute(url, null, WxType.MP); - return WxMpUser.fromJson(responseText); - } catch (IOException e) { - throw new RuntimeException(e); - } + return this.oAuth2Service.getUserInfo(token,lang); } @Override public boolean oauth2validateAccessToken(WxMpOAuth2AccessToken token) { - String url = String.format(OAUTH2_VALIDATE_TOKEN_URL.getUrl(this.getWxMpConfigStorage()), token.getAccessToken(), token.getOpenId()); - - try { - SimpleGetRequestExecutor.create(this).execute(url, null, WxType.MP); - } catch (IOException e) { - throw new RuntimeException(e); - } catch (WxErrorException e) { - return false; - } - return true; + return this.oAuth2Service.validateAccessToken(token); } @Override @@ -491,218 +512,9 @@ public void setMaxRetryTimes(int maxRetryTimes) { this.maxRetryTimes = maxRetryTimes; } - @Override - public WxMpKefuService getKefuService() { - return this.kefuService; - } - - @Override - public WxMpMaterialService getMaterialService() { - return this.materialService; - } - - @Override - public WxMpMenuService getMenuService() { - return this.menuService; - } - - @Override - public WxMpUserService getUserService() { - return this.userService; - } - - @Override - public WxMpUserTagService getUserTagService() { - return this.tagService; - } - - @Override - public WxMpQrcodeService getQrcodeService() { - return this.qrCodeService; - } - - @Override - public WxMpCardService getCardService() { - return this.cardService; - } - - @Override - public WxMpDataCubeService getDataCubeService() { - return this.dataCubeService; - } - - @Override - public WxMpUserBlacklistService getBlackListService() { - return this.blackListService; - } - - @Override - public WxMpStoreService getStoreService() { - return this.storeService; - } - - @Override - public WxMpTemplateMsgService getTemplateMsgService() { - return this.templateMsgService; - } - - @Override - public WxMpSubscribeMsgService getSubscribeMsgService() { - return this.subscribeMsgService; - } - - @Override - public WxMpDeviceService getDeviceService() { - return this.deviceService; - } - - @Override - public WxMpShakeService getShakeService() { - return this.shakeService; - } - - @Override - public WxMpMemberCardService getMemberCardService() { - return this.memberCardService; - } - @Override public RequestHttp getRequestHttp() { return this; } - @Override - public WxMpMassMessageService getMassMessageService() { - return this.massMessageService; - } - - @Override - public void setKefuService(WxMpKefuService kefuService) { - this.kefuService = kefuService; - } - - @Override - public void setMaterialService(WxMpMaterialService materialService) { - this.materialService = materialService; - } - - @Override - public void setMenuService(WxMpMenuService menuService) { - this.menuService = menuService; - } - - @Override - public void setUserService(WxMpUserService userService) { - this.userService = userService; - } - - @Override - public void setTagService(WxMpUserTagService tagService) { - this.tagService = tagService; - } - - @Override - public void setQrCodeService(WxMpQrcodeService qrCodeService) { - this.qrCodeService = qrCodeService; - } - - @Override - public void setCardService(WxMpCardService cardService) { - this.cardService = cardService; - } - - @Override - public void setStoreService(WxMpStoreService storeService) { - this.storeService = storeService; - } - - @Override - public void setDataCubeService(WxMpDataCubeService dataCubeService) { - this.dataCubeService = dataCubeService; - } - - @Override - public void setBlackListService(WxMpUserBlacklistService blackListService) { - this.blackListService = blackListService; - } - - @Override - public void setTemplateMsgService(WxMpTemplateMsgService templateMsgService) { - this.templateMsgService = templateMsgService; - } - - @Override - public void setDeviceService(WxMpDeviceService deviceService) { - this.deviceService = deviceService; - } - - @Override - public void setShakeService(WxMpShakeService shakeService) { - this.shakeService = shakeService; - } - - @Override - public void setMemberCardService(WxMpMemberCardService memberCardService) { - this.memberCardService = memberCardService; - } - - @Override - public void setMassMessageService(WxMpMassMessageService massMessageService) { - this.massMessageService = massMessageService; - } - - @Override - public WxMpAiOpenService getAiOpenService() { - return this.aiOpenService; - } - - @Override - public void setAiOpenService(WxMpAiOpenService aiOpenService) { - this.aiOpenService = aiOpenService; - } - - @Override - public WxMpWifiService getWifiService() { - return this.wifiService; - } - - @Override - public WxOcrService getOcrService() { - return this.ocrService; - } - - @Override - public WxMpMarketingService getMarketingService() { - return this.marketingService; - } - - @Override - public void setMarketingService(WxMpMarketingService marketingService) { - this.marketingService = marketingService; - } - - @Override - public void setOcrService(WxOcrService ocrService) { - this.ocrService = ocrService; - } - - @Override - public WxMpCommentService getCommentService() { - return this.commentService; - } - - @Override - public void setCommentService(WxMpCommentService commentService) { - this.commentService = commentService; - } - - @Override - public WxImgProcService getImgProcService() { - return this.imgProcService; - } - - @Override - public void setImgProcService(WxImgProcService imgProcService) { - this.imgProcService = imgProcService; - } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxOAuth2ServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxOAuth2ServiceImpl.java new file mode 100644 index 0000000000..3c6287b7dd --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxOAuth2ServiceImpl.java @@ -0,0 +1,95 @@ +package me.chanjar.weixin.mp.api.impl; + +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +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.RequestExecutor; +import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; +import me.chanjar.weixin.common.util.http.URIUtil; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxOAuth2Service; +import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; +import me.chanjar.weixin.mp.bean.result.WxMpUser; +import me.chanjar.weixin.mp.config.WxMpConfigStorage; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; + +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.*; + +/** + * oauth2 相关接口实现类. + * + * @author Binary Wang + * @date 2020-08-08 + */ +@RequiredArgsConstructor +public class WxOAuth2ServiceImpl implements WxOAuth2Service { + private final WxMpService wxMpService; + + @Override + public String buildAuthorizationUrl(String redirectURI, String scope, String state) { + return String.format(CONNECT_OAUTH2_AUTHORIZE_URL.getUrl(getMpConfigStorage()), + getMpConfigStorage().getAppId(), URIUtil.encodeURIComponent(redirectURI), scope, StringUtils.trimToEmpty(state)); + } + + private WxMpOAuth2AccessToken getOAuth2AccessToken(String url) throws WxErrorException { + try { + RequestExecutor executor = SimpleGetRequestExecutor.create(this.wxMpService.getRequestHttp()); + String responseText = executor.execute(url, null, WxType.MP); + return WxMpOAuth2AccessToken.fromJson(responseText); + } catch (IOException e) { + throw new WxErrorException(WxError.builder().errorCode(99999).errorMsg(e.getMessage()).build(), e); + } + } + + @Override + public WxMpOAuth2AccessToken getAccessToken(String code) throws WxErrorException { + String url = String.format(OAUTH2_ACCESS_TOKEN_URL.getUrl(getMpConfigStorage()), getMpConfigStorage().getAppId(), + getMpConfigStorage().getSecret(), code); + return this.getOAuth2AccessToken(url); + } + + @Override + public WxMpOAuth2AccessToken refreshAccessToken(String refreshToken) throws WxErrorException { + String url = String.format(OAUTH2_REFRESH_TOKEN_URL.getUrl(getMpConfigStorage()), getMpConfigStorage().getAppId(), refreshToken); + return this.getOAuth2AccessToken(url); + } + + protected WxMpConfigStorage getMpConfigStorage() { + return this.wxMpService.getWxMpConfigStorage(); + } + + @Override + public WxMpUser getUserInfo(WxMpOAuth2AccessToken token, String lang) throws WxErrorException { + if (lang == null) { + lang = "zh_CN"; + } + + String url = String.format(OAUTH2_USERINFO_URL.getUrl(getMpConfigStorage()), token.getAccessToken(), token.getOpenId(), lang); + + try { + RequestExecutor executor = SimpleGetRequestExecutor.create(this.wxMpService.getRequestHttp()); + String responseText = executor.execute(url, null, WxType.MP); + return WxMpUser.fromJson(responseText); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public boolean validateAccessToken(WxMpOAuth2AccessToken token) { + String url = String.format(OAUTH2_VALIDATE_TOKEN_URL.getUrl(getMpConfigStorage()), token.getAccessToken(), token.getOpenId()); + + try { + SimpleGetRequestExecutor.create(this.wxMpService.getRequestHttp()).execute(url, null, WxType.MP); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (WxErrorException e) { + return false; + } + return true; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxOAuth2ServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxOAuth2ServiceImplTest.java new file mode 100644 index 0000000000..8729f99d2f --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxOAuth2ServiceImplTest.java @@ -0,0 +1,47 @@ +package me.chanjar.weixin.mp.api.impl; + +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.test.ApiTestModule; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import javax.inject.Inject; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * 测试类. + * + * @author Binary Wang + * @date 2020-08-09 + */ +@Test +@Guice(modules = ApiTestModule.class) +public class WxOAuth2ServiceImplTest { + @Inject + private WxMpService mpService; + + @Test + public void testBuildAuthorizationUrl() { + final String url = this.mpService.getOAuth2Service().buildAuthorizationUrl("http://www.baidu.com", "test", "GOD"); + assertThat(url).isEqualTo("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + + this.mpService.getWxMpConfigStorage().getAppId() + + "&redirect_uri=http%3A%2F%2Fwww.baidu.com&response_type=code&scope=test&state=GOD&connect_redirect=1#wechat_redirect"); + } + + @Test + public void testGetAccessToken() { + } + + @Test + public void testRefreshAccessToken() { + } + + @Test + public void testGetUserInfo() { + } + + @Test + public void testValidateAccessToken() { + } +} From 4d3346d0c143165b2e2fc5a7c652134d6404d82a Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 9 Aug 2020 20:01:25 +0800 Subject: [PATCH 70/90] =?UTF-8?q?:art:=20#1688=20=E5=8D=87=E7=BA=A7jedis?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC=E4=B8=BA3.3.0=EF=BC=8C?= =?UTF-8?q?=E5=B7=B2=E8=A7=A3=E5=86=B3=E9=83=A8=E5=88=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java | 2 +- .../chanjar/weixin/common/util/locks/JedisDistributedLock.java | 2 +- .../weixin/open/api/impl/WxOpenInRedisConfigStorage.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index d1b8da28a5..ad05d69f4c 100644 --- a/pom.xml +++ b/pom.xml @@ -244,7 +244,7 @@ redis.clients jedis - 2.9.0 + 3.3.0 provided diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java index b42142943f..4cfa84c160 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.util.locks.JedisDistributedLock; import redis.clients.jedis.Jedis; -import redis.clients.util.Pool; +import redis.clients.jedis.util.Pool; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; 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 b136a4c25a..074f9d9351 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 @@ -6,7 +6,7 @@ import com.github.jedis.lock.JedisLock; import redis.clients.jedis.Jedis; -import redis.clients.util.Pool; +import redis.clients.jedis.util.Pool; /** * JedisPool 分布式锁 diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java index 31c199bba7..9ce7851065 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java @@ -4,7 +4,7 @@ import me.chanjar.weixin.common.redis.JedisWxRedisOps; import me.chanjar.weixin.common.redis.WxRedisOps; import redis.clients.jedis.Jedis; -import redis.clients.util.Pool; +import redis.clients.jedis.util.Pool; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; From ce8f4f8caba851bf114b4b4ad261cd145f6a06fd Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 9 Aug 2020 20:45:44 +0800 Subject: [PATCH 71/90] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=203.8.8.B?= =?UTF-8?q?=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 +- 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 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index ad05d69f4c..1e55e3c7d6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.8.7.B + 3.8.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 818c3d3701..078378c535 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.7.B + 3.8.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 7b11311c7b..26923a761a 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.7.B + 3.8.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 678a0b4559..0e3fbbc006 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.7.B + 3.8.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 f4ca866af1..d63e8a0d3c 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.7.B + 3.8.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 d38ff651b7..912197018b 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.7.B + 3.8.8.B 4.0.0 diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml index cc84e9a731..32712bf6f1 100644 --- a/weixin-graal/pom.xml +++ b/weixin-graal/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.7.B + 3.8.8.B weixin-graal diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index cef4052c9f..9abb8e3530 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.7.B + 3.8.8.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index fafa157e2d..86bd5b74c6 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.7.B + 3.8.8.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 81a33f62e5..8a93d96537 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.7.B + 3.8.8.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 663b0490fa..c0c2e40d5d 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.7.B + 3.8.8.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 14b7cd6df5..8f90f6af05 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.7.B + 3.8.8.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 70f8d89fde..82ed2af51b 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.8.7.B + 3.8.8.B 4.0.0 From a7ea5f5bf3de0967d41808cc5653b71fcb2b9472 Mon Sep 17 00:00:00 2001 From: huangxm129 <40385667+huangxm129@users.noreply.github.com> Date: Sun, 16 Aug 2020 12:51:34 +0800 Subject: [PATCH 72/90] =?UTF-8?q?:bug:=20#1713=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E4=BF=AE=E5=A4=8D=E8=8E=B7=E5=8F=96=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=B7=B2=E9=85=8D=E7=BD=AE=E7=9A=84=E3=80=8C=E8=81=94?= =?UTF-8?q?=E7=B3=BB=E6=88=91=E3=80=8D=E6=96=B9=E5=BC=8F=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 外部联系人客户详情新增增加字段 增加字段:remark_corp_name,addWay,oper_userid Signed-off-by: huangxiaoming * 修改测试类 Signed-off-by: huangxiaoming * 客户标签组查询列表功能修改 Signed-off-by: huangxiaoming * 修改测试类 Signed-off-by: huangxiaoming * 修改 add_way字段错误 Signed-off-by: huangxiaoming * 修改添加企业客户标签后无返回信息 Signed-off-by: huangxiaoming * 外部联系人客户详情新增增加字段 增加字段:remark_corp_name,addWay,oper_userid Signed-off-by: huangxiaoming * 修改测试类 Signed-off-by: huangxiaoming * 修改测试类 Signed-off-by: huangxiaoming * 修改 add_way字段错误 Signed-off-by: huangxiaoming * 修改添加企业客户标签后无返回信息 Signed-off-by: huangxiaoming * 修改错误 Signed-off-by: huangxiaoming * 修改冲突 Signed-off-by: huangxiaoming * 获取企业已配置的「联系我」方式:添加二维码字段 Signed-off-by: huangxiaoming * 获取企业已配置的「联系我」方式对象无返回信息BUG Signed-off-by: huangxiaoming --- .../impl/WxCpExternalContactServiceImpl.java | 11 +- .../weixin/cp/bean/WxCpContactWayInfo.java | 301 ++++++++++-------- .../cp/util/json/WxCpConclusionAdapter.java | 8 +- .../WxCpExternalContactServiceImplTest.java | 25 +- 4 files changed, 188 insertions(+), 157 deletions(-) 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 b38c6b868c..952391cf90 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 @@ -28,12 +28,12 @@ public class WxCpExternalContactServiceImpl implements WxCpExternalContactServic @Override public WxCpContactWayResult addContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException { - if (info.getUsers() != null && info.getUsers().size() > 100) { + if (info.getContactWay().getUsers() != null && info.getContactWay().getUsers().size() > 100) { throw new RuntimeException("「联系我」使用人数默认限制不超过100人(包括部门展开后的人数)"); } final String url = this.mainService.getWxCpConfigStorage().getApiUrl(ADD_CONTACT_WAY); - String responseContent = this.mainService.post(url, info.toJson()); + String responseContent = this.mainService.post(url, info.getContactWay().toJson()); return WxCpContactWayResult.fromJson(responseContent); } @@ -45,21 +45,20 @@ public WxCpContactWayInfo getContactWay(@NonNull String configId) throws WxError final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CONTACT_WAY); String responseContent = this.mainService.post(url, json.toString()); - return WxCpContactWayInfo.fromJson(responseContent); } @Override public WxCpBaseResp updateContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException { - if (StringUtils.isBlank(info.getConfigId())) { + if (StringUtils.isBlank(info.getContactWay().getConfigId())) { throw new RuntimeException("更新「联系我」方式需要指定configId"); } - if (info.getUsers() != null && info.getUsers().size() > 100) { + if (info.getContactWay().getUsers() != null && info.getContactWay().getUsers().size() > 100) { throw new RuntimeException("「联系我」使用人数默认限制不超过100人(包括部门展开后的人数)"); } final String url = this.mainService.getWxCpConfigStorage().getApiUrl(UPDATE_CONTACT_WAY); - String responseContent = this.mainService.post(url, info.toJson()); + String responseContent = this.mainService.post(url, info.getContactWay().toJson()); return WxCpBaseResp.fromJson(responseContent); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java index 3f62e4f0e4..8ef22a587b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java @@ -3,7 +3,9 @@ import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import me.chanjar.weixin.cp.util.json.WxCpConclusionAdapter; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; @@ -18,124 +20,168 @@ @NoArgsConstructor public class WxCpContactWayInfo { - /** - * 联系方式的配置id - */ - @SerializedName("config_id") - private String configId; - - /** - *
-   * 必填
-   * 联系方式类型,1-单人, 2-多人
-   * 
- */ - private TYPE type; - - /** - *
-   * 必填
-   * 场景,1-在小程序中联系,2-通过二维码联系
-   * 
- */ - private SCENE scene; - - /** - *
-   * 非必填
-   * 在小程序中联系时使用的控件样式
-   * 单人样式(type=1)时可选1,2,3
-   * 多人样式(type=2)时可选1,2
-   * 
- */ - private Integer style; - - /** - *
-   * 非必填
-   * 联系方式的备注信息,用于助记,不超过30个字符
-   * 
- */ - private String remark; - - /** - *
-   * 非必填
-   * 外部客户添加时是否无需验证,默认为true
-   * 
- */ - @SerializedName("skip_verify") - private Boolean skipVerify = Boolean.TRUE; - - /** - *
-   * 非必填
-   * 企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情(WxCpExternalContactService.getContactDetail)”  时会返回该参数值,不超过30个字符
-   * 
- */ - private String state; - - /** - *
-   * 使用该联系方式的用户userID列表,在type为1时为必填,且只能有一个
-   * 
- */ - @SerializedName("user") - private List users; - - - /** - *
-   * 非必填
-   * 使用该联系方式的部门id列表,只在type为2时有效
-   * 
- */ - @SerializedName("party") - private List partys; - - /** - *
-   * 非必填
-   * 是否临时会话模式,true表示使用临时会话模式,默认为false
-   * 
- */ - @SerializedName("is_temp") - private Boolean isTemp = Boolean.FALSE; - - /** - *
-   * 非必填
-   * 临时会话二维码有效期,以秒为单位。该参数仅在is_temp为true时有效,默认7天
-   * 
- */ - @SerializedName("expires_in") - private Integer expiresIn; - - /** - *
-   * 非必填
-   * 临时会话有效期,以秒为单位。该参数仅在is_temp为true时有效,默认为添加好友后24小时
-   * 
- */ - @SerializedName("chat_expires_in") - private Integer chatExpiresIn; - - /** - *
-   * 非必填
-   * 可进行临时会话的客户unionid,该参数仅在is_temp为true时有效,如不指定则不进行限制
-   * 
- */ - @SerializedName("unionid") - private String unionId; - - /** - *
-   * 非必填
-   * 结束语,会话结束时自动发送给客户,可参考“结束语定义”,仅在is_temp为true时有效
-   * 
- */ - private Conclusion conclusions; + @SerializedName("contact_way") + private ContactWay contactWay; + + @Getter + @Setter + public static class ContactWay { + /** + * 联系方式的配置id + */ + @SerializedName("config_id") + private String configId; + + /** + *
+     * 必填
+     * 联系方式类型,1-单人, 2-多人
+     * 
+ */ + private TYPE type; + + /** + *
+     * 必填
+     * 场景,1-在小程序中联系,2-通过二维码联系
+     * 
+ */ + private SCENE scene; + + /** + *
+     * 非必填
+     * 在小程序中联系时使用的控件样式
+     * 单人样式(type=1)时可选1,2,3
+     * 多人样式(type=2)时可选1,2
+     * 
+ */ + private Integer style; + + /** + *
+     * 非必填
+     * 联系方式的备注信息,用于助记,不超过30个字符
+     * 
+ */ + private String remark; + + /** + *
+     * 非必填
+     * 外部客户添加时是否无需验证,默认为true
+     * 
+ */ + @SerializedName("skip_verify") + private Boolean skipVerify = Boolean.TRUE; + + /** + *
+     * 非必填
+     * 企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情(WxCpExternalContactService.getContactDetail)”  时会返回该参数值,不超过30个字符
+     * 
+ */ + private String state; + + /** + *
+     * 联系二维码的URL,仅在scene为2时返回
+     * 
+ */ + @SerializedName("qr_code") + private String qrCode; + + /** + *
+     * 使用该联系方式的用户userID列表,在type为1时为必填,且只能有一个
+     * 
+ */ + @SerializedName("user") + private List users; + + + /** + *
+     * 非必填
+     * 使用该联系方式的部门id列表,只在type为2时有效
+     * 
+ */ + @SerializedName("party") + private List partys; + + /** + *
+     * 非必填
+     * 是否临时会话模式,true表示使用临时会话模式,默认为false
+     * 
+ */ + @SerializedName("is_temp") + private Boolean isTemp = Boolean.FALSE; + + /** + *
+     * 非必填
+     * 临时会话二维码有效期,以秒为单位。该参数仅在is_temp为true时有效,默认7天
+     * 
+ */ + @SerializedName("expires_in") + private Integer expiresIn; + + /** + *
+     * 非必填
+     * 临时会话有效期,以秒为单位。该参数仅在is_temp为true时有效,默认为添加好友后24小时
+     * 
+ */ + @SerializedName("chat_expires_in") + private Integer chatExpiresIn; + + /** + *
+     * 非必填
+     * 可进行临时会话的客户unionid,该参数仅在is_temp为true时有效,如不指定则不进行限制
+     * 
+ */ + @SerializedName("unionid") + private String unionId; + + /** + *
+     * 非必填
+     * 结束语,会话结束时自动发送给客户,可参考“结束语定义”,仅在is_temp为true时有效
+     * 
+ */ + private Conclusion conclusions; + + public static WxCpContactWayInfo.ContactWay fromJson(String json) { + return WxCpGsonBuilder.create().fromJson(json, WxCpContactWayInfo.ContactWay.class); + } + + public String toJson() { + return WxCpGsonBuilder.create().toJson(this); + } + + /** + * 结束语定义 + */ + @Data + @JsonAdapter(WxCpConclusionAdapter.class) + public static class Conclusion { + private String textContent; + private String imgMediaId; + private String imgPicUrl; + private String linkTitle; + private String linkPicUrl; + private String linkDesc; + private String linkUrl; + private String miniProgramTitle; + private String miniProgramPicMediaId; + private String miniProgramAppId; + private String miniProgramPage; + } + + } + public static WxCpContactWayInfo fromJson(String json) { return WxCpGsonBuilder.create().fromJson(json, WxCpContactWayInfo.class); @@ -145,25 +191,6 @@ public String toJson() { return WxCpGsonBuilder.create().toJson(this); } - /** - * 结束语定义 - */ - @Data - @JsonAdapter(WxCpConclusionAdapter.class) - public static class Conclusion { - private String textContent; - private String imgMediaId; - private String imgPicUrl; - private String linkTitle; - private String linkPicUrl; - private String linkDesc; - private String linkUrl; - private String miniProgramTitle; - private String miniProgramPicMediaId; - private String miniProgramAppId; - private String miniProgramPage; - } - public enum TYPE { /** * 单人 diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java index 1a9aab8bf9..2d7e27da9d 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java @@ -11,12 +11,12 @@ * * @author element */ -public class WxCpConclusionAdapter implements JsonSerializer, JsonDeserializer { +public class WxCpConclusionAdapter implements JsonSerializer, JsonDeserializer { @Override - public WxCpContactWayInfo.Conclusion deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + public WxCpContactWayInfo.ContactWay.Conclusion deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); - WxCpContactWayInfo.Conclusion conclusion = new WxCpContactWayInfo.Conclusion(); + WxCpContactWayInfo.ContactWay.Conclusion conclusion = new WxCpContactWayInfo.ContactWay.Conclusion(); if (jsonObject.get("text") != null) { JsonObject jsonText = jsonObject.get("text").getAsJsonObject(); @@ -77,7 +77,7 @@ public WxCpContactWayInfo.Conclusion deserialize(JsonElement json, Type typeOfT, } @Override - public JsonElement serialize(WxCpContactWayInfo.Conclusion src, Type typeOfSrc, JsonSerializationContext context) { + public JsonElement serialize(WxCpContactWayInfo.ContactWay.Conclusion src, Type typeOfSrc, JsonSerializationContext context) { JsonObject json = new JsonObject(); if (StringUtils.isNotBlank(src.getTextContent())) { JsonObject jsonText = new JsonObject(); 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 df086037a5..8a5a76496b 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 @@ -35,21 +35,24 @@ public void testGetExternalContact() throws WxErrorException { @Test public void testAddContactWay() throws WxErrorException { - final String concatUserId = "符合要求的userId"; + final String concatUserId = "HuangXiaoMing"; + + WxCpContactWayInfo.ContactWay wayInfo = new WxCpContactWayInfo.ContactWay(); + wayInfo.setType(WxCpContactWayInfo.TYPE.SIGLE); + wayInfo.setScene(WxCpContactWayInfo.SCENE.QRCODE); + wayInfo.setUsers(Lists.newArrayList(concatUserId)); + wayInfo.setRemark("CreateDate:" + DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.format(new Date())); WxCpContactWayInfo info = new WxCpContactWayInfo(); - info.setType(WxCpContactWayInfo.TYPE.SIGLE); - info.setScene(WxCpContactWayInfo.SCENE.MINIPROGRAM); - info.setUsers(Lists.newArrayList(concatUserId)); - info.setRemark("CreateDate:" + DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.format(new Date())); + info.setContactWay(wayInfo); this.wxCpService.getExternalContactService().addContactWay(info); } @Test public void testGetContactWay() throws WxErrorException { - final String configId = "2d7a68c657663afbd1d90db19a4b5ee9"; + final String configId = "39fea3d93e30faaa8c7a9edd4cfe4d08"; WxCpContactWayInfo contactWayInfo = this.wxCpService.getExternalContactService().getContactWay(configId); - System.out.println(contactWayInfo); + System.out.println(contactWayInfo.toJson()); assertNotNull(contactWayInfo); } @@ -57,10 +60,12 @@ public void testGetContactWay() throws WxErrorException { public void testUpdateContactWay() throws WxErrorException { final String configId = "2d7a68c657663afbd1d90db19a4b5ee9"; final String concatUserId = "符合要求的userId"; + WxCpContactWayInfo.ContactWay wayInfo = new WxCpContactWayInfo.ContactWay(); + wayInfo.setConfigId(configId); + wayInfo.setUsers(Lists.newArrayList(concatUserId)); + wayInfo.setRemark("CreateDate:" + DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.format(new Date())); WxCpContactWayInfo info = new WxCpContactWayInfo(); - info.setConfigId(configId); - info.setUsers(Lists.newArrayList(concatUserId)); - info.setRemark("CreateDate:" + DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.format(new Date())); + info.setContactWay(wayInfo); WxCpBaseResp resp = this.wxCpService.getExternalContactService().updateContactWay(info); System.out.println(resp); assertNotNull(resp); From 928ba178a33c4250b68c9c4d4165bdfd7f30838d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 16 Aug 2020 13:06:43 +0800 Subject: [PATCH 73/90] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF=E7=9A=84=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 --- .../java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java | 4 ++-- .../cp/api/impl/WxCpExternalContactServiceImplTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java index 8ef22a587b..52ae978f32 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java @@ -107,7 +107,7 @@ public static class ContactWay { *
*/ @SerializedName("party") - private List partys; + private List parties; /** *
@@ -196,7 +196,7 @@ public enum TYPE {
      * 单人
      */
     @SerializedName("1")
-    SIGLE,
+    SINGLE,
 
     /**
      * 多人
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 8a5a76496b..3997e2d00c 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
@@ -38,7 +38,7 @@ public void testAddContactWay() throws WxErrorException {
     final String concatUserId = "HuangXiaoMing";
 
     WxCpContactWayInfo.ContactWay wayInfo = new WxCpContactWayInfo.ContactWay();
-    wayInfo.setType(WxCpContactWayInfo.TYPE.SIGLE);
+    wayInfo.setType(WxCpContactWayInfo.TYPE.SINGLE);
     wayInfo.setScene(WxCpContactWayInfo.SCENE.QRCODE);
     wayInfo.setUsers(Lists.newArrayList(concatUserId));
     wayInfo.setRemark("CreateDate:" + DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.format(new Date()));

From 8b7ca9b7b4700e60d49c5dc393c47fdef50d2ece Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 16 Aug 2020 14:33:31 +0800
Subject: [PATCH 74/90] =?UTF-8?q?:new:=20#1710=20=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=A2=9E=E5=8A=A0=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?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/common/redis/JedisWxRedisOps.java  |   1 -
 .../cp/api/WxCpExternalContactService.java    | 181 +++++++++++-------
 .../weixin/cp/api/WxCpUserService.java        |   2 +-
 .../impl/WxCpExternalContactServiceImpl.java  |   7 +
 .../cp/api/impl/WxCpUserServiceImpl.java      |   2 +-
 .../{ => external}/WxCpContactWayInfo.java    |   2 +-
 .../{ => external}/WxCpContactWayResult.java  |   3 +-
 .../bean/{ => external}/WxCpMsgTemplate.java  |  42 +---
 .../WxCpMsgTemplateAddResult.java             |   4 +-
 .../WxCpUserExternalContactInfo.java          |   2 +-
 .../WxCpUserExternalContactList.java          |   2 +-
 .../WxCpUserExternalGroupChatInfo.java        |   5 +-
 .../WxCpUserExternalGroupChatList.java        |   3 +-
 .../WxCpUserExternalGroupChatStatistic.java   |  37 ++--
 .../WxCpUserExternalTagGroupInfo.java         |   3 +-
 .../WxCpUserExternalTagGroupList.java         |   3 +-
 .../WxCpUserExternalUnassignList.java         |   5 +-
 ...WxCpUserExternalUserBehaviorStatistic.java |   3 +-
 .../WxCpUserWithExternalPermission.java       |   2 +-
 .../cp/bean/external/WxCpWelcomeMsg.java      |  40 ++++
 .../weixin/cp/bean/external/msg/Image.java    |  23 +++
 .../weixin/cp/bean/external/msg/Link.java     |  22 +++
 .../cp/bean/external/msg/MiniProgram.java     |  23 +++
 .../weixin/cp/bean/external/msg/Text.java     |  17 ++
 .../cp/config/impl/WxCpRedisConfigImpl.java   |   2 +
 .../weixin/cp/constant/WxCpApiPathConsts.java |   1 +
 .../cp/util/json/WxCpConclusionAdapter.java   |   2 +-
 .../WxCpExternalContactServiceImplTest.java   |  67 +++++--
 .../bean/WxCpUserExternalContactInfoTest.java |   1 +
 29 files changed, 363 insertions(+), 144 deletions(-)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpContactWayInfo.java (99%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpContactWayResult.java (82%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpMsgTemplate.java (60%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpMsgTemplateAddResult.java (92%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalContactInfo.java (98%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalContactList.java (96%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalGroupChatInfo.java (90%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalGroupChatList.java (90%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalGroupChatStatistic.java (62%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalTagGroupInfo.java (94%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalTagGroupList.java (94%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalUnassignList.java (86%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserExternalUserBehaviorStatistic.java (96%)
 rename weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/{ => external}/WxCpUserWithExternalPermission.java (93%)
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Image.java
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Link.java
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/MiniProgram.java
 create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Text.java

diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java
index 4cfa84c160..2b9849ff92 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java
@@ -10,7 +10,6 @@
 
 @RequiredArgsConstructor
 public class JedisWxRedisOps implements WxRedisOps {
-
   private final Pool jedisPool;
 
   @Override
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 12d7944627..a386b0ead2 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
@@ -2,7 +2,8 @@
 
 import lombok.NonNull;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.cp.bean.*;
+import me.chanjar.weixin.cp.bean.WxCpBaseResp;
+import me.chanjar.weixin.cp.bean.external.*;
 
 import java.util.Date;
 import java.util.List;
@@ -32,8 +33,8 @@ public interface WxCpExternalContactService {
    * 
* * @param info 客户联系「联系我」方式 - * @return - * @throws WxErrorException + * @return wx cp contact way result + * @throws WxErrorException the wx error exception */ WxCpContactWayResult addContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException; @@ -45,8 +46,8 @@ public interface WxCpExternalContactService { *
* * @param configId 联系方式的配置id,必填 - * @return - * @throws WxErrorException + * @return contact way + * @throws WxErrorException the wx error exception */ WxCpContactWayInfo getContactWay(@NonNull String configId) throws WxErrorException; @@ -58,8 +59,8 @@ public interface WxCpExternalContactService { *
* * @param info 客户联系「联系我」方式 - * @return - * @throws WxErrorException + * @return wx cp base resp + * @throws WxErrorException the wx error exception */ WxCpBaseResp updateContactWay(@NonNull WxCpContactWayInfo info) throws WxErrorException; @@ -71,8 +72,8 @@ public interface WxCpExternalContactService { *
* * @param configId 企业联系方式的配置id,必填 - * @return - * @throws WxErrorException + * @return wx cp base resp + * @throws WxErrorException the wx error exception */ WxCpBaseResp deleteContactWay(@NonNull String configId) throws WxErrorException; @@ -85,10 +86,10 @@ public interface WxCpExternalContactService { * 注意:请保证传入的企业成员和客户之间有仍然有效的临时会话, 通过其他方式的添加外部联系人无法通过此接口关闭会话。 *
* - * @param userId - * @param externalUserId - * @return - * @throws WxErrorException + * @param userId the user id + * @param externalUserId the external user id + * @return wx cp base resp + * @throws WxErrorException the wx error exception */ WxCpBaseResp closeTempChat(@NonNull String userId, @NonNull String externalUserId) throws WxErrorException; @@ -103,7 +104,8 @@ public interface WxCpExternalContactService { *
* * @param userId 外部联系人的userid - * @return . + * @return . external contact + * @throws WxErrorException the wx error exception * @deprecated 建议使用 {@link #getContactDetail(String)} */ @Deprecated @@ -125,7 +127,7 @@ public interface WxCpExternalContactService { *
* * @param userId 外部联系人的userid,注意不是企业成员的帐号 - * @return . + * @return . contact detail * @throws WxErrorException . */ WxCpUserExternalContactInfo getContactDetail(String userId) throws WxErrorException; @@ -167,21 +169,21 @@ public interface WxCpExternalContactService { /** * 企业和第三方可通过此接口,获取所有离职成员的客户列表,并可进一步调用离职成员的外部联系人再分配接口将这些客户重新分配给其他企业成员。 * - * @param page - * @param pageSize - * @return - * @throws WxErrorException + * @param page the page + * @param pageSize the page size + * @return wx cp user external unassign list + * @throws WxErrorException the wx error exception */ WxCpUserExternalUnassignList listUnassignedList(Integer page, Integer pageSize) throws WxErrorException; /** * 企业可通过此接口,将已离职成员的外部联系人分配给另一个成员接替联系。 * - * @param externalUserid - * @param handOverUserid - * @param takeOverUserid - * @return - * @throws WxErrorException + * @param externalUserid the external userid + * @param handOverUserid the hand over userid + * @param takeOverUserid the take over userid + * @return wx cp base resp + * @throws WxErrorException the wx error exception */ WxCpBaseResp transferExternalContact(String externalUserid, String handOverUserid, String takeOverUserid) throws WxErrorException; @@ -192,6 +194,14 @@ public interface WxCpExternalContactService { * 暂不支持第三方调用。 * 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92119 *
+ * + * @param pageIndex the page index + * @param pageSize the page size + * @param status the status + * @param userIds the user ids + * @param partyIds the party ids + * @return the wx cp user external group chat list + * @throws WxErrorException the wx error exception */ WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pageSize, int status, String[] userIds, String[] partyIds) throws WxErrorException; @@ -203,9 +213,9 @@ public interface WxCpExternalContactService { * 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92122 *
* - * @param chatId - * @return - * @throws WxErrorException + * @param chatId the chat id + * @return group chat + * @throws WxErrorException the wx error exception */ WxCpUserExternalGroupChatInfo getGroupChat(String chatId) throws WxErrorException; @@ -217,12 +227,12 @@ public interface WxCpExternalContactService { * 第三方/自建应用调用时传入的userid和partyid要在应用的可见范围内; *
* - * @param startTime - * @param endTime - * @param userIds - * @param partyIds - * @return - * @throws WxErrorException + * @param startTime the start time + * @param endTime the end time + * @param userIds the user ids + * @param partyIds the party ids + * @return user behavior statistic + * @throws WxErrorException the wx error exception */ WxCpUserExternalUserBehaviorStatistic getUserBehaviorStatistic(Date startTime, Date endTime, String[] userIds, String[] partyIds) throws WxErrorException; @@ -233,74 +243,117 @@ public interface WxCpExternalContactService { * 暂不支持第三方调用。 *
* - * @param startTime - * @param orderBy - * @param orderAsc - * @param pageIndex - * @param pageSize - * @param userIds - * @param partyIds - * @return - * @throws WxErrorException + * @param startTime the start time + * @param orderBy the order by + * @param orderAsc the order asc + * @param pageIndex the page index + * @param pageSize the page size + * @param userIds the user ids + * @param partyIds the party ids + * @return group chat statistic + * @throws WxErrorException the wx error exception */ WxCpUserExternalGroupChatStatistic getGroupChatStatistic(Date startTime, Integer orderBy, Integer orderAsc, Integer pageIndex, Integer pageSize, String[] userIds, String[] partyIds) throws WxErrorException; + /** + * 添加企业群发消息任务 + * 企业可通过此接口添加企业群发消息的任务并通知客服人员发送给相关客户或客户群。(注:企业微信终端需升级到2.7.5版本及以上) + * 注意:调用该接口并不会直接发送消息给客户/客户群,需要相关的客服人员操作以后才会实际发送(客服人员的企业微信需要升级到2.7.5及以上版本) + * 同一个企业每个自然月内仅可针对一个客户/客户群发送4条消息,超过限制的用户将会被忽略。 + *

+ * 请求方式: POST(HTTP) + *

+ * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_msg_template?access_token=ACCESS_TOKEN + *

+ * 文档地址:https://work.weixin.qq.com/api/doc/90000/90135/92135 + * + * @param wxCpMsgTemplate the wx cp msg template + * @return the wx cp msg template add result + * @throws WxErrorException the wx error exception + */ WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate) throws WxErrorException; + /** + * 发送新客户欢迎语 + *

+   * 企业微信在向企业推送添加外部联系人事件时,会额外返回一个welcome_code,企业以此为凭据调用接口,即可通过成员向新添加的客户发送个性化的欢迎语。
+   * 为了保证用户体验以及避免滥用,企业仅可在收到相关事件后20秒内调用,且只可调用一次。
+   * 如果企业已经在管理端为相关成员配置了可用的欢迎语,则推送添加外部联系人事件时不会返回welcome_code。
+   * 每次添加新客户时可能有多个企业自建应用/第三方应用收到带有welcome_code的回调事件,但仅有最先调用的可以发送成功。后续调用将返回41051(externaluser has started chatting)错误,请用户根据实际使用需求,合理设置应用可见范围,避免冲突。
+   * 请求方式: POST(HTTP)
+   *
+   * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_welcome_msg?access_token=ACCESS_TOKEN
+   *
+   * 文档地址:https://work.weixin.qq.com/api/doc/90000/90135/92137
+   * 
+ * + * @param msg . + * @throws WxErrorException . + */ + void sendWelcomeMsg(WxCpWelcomeMsg msg) throws WxErrorException; /** *
    * 企业可通过此接口获取企业客户标签详情。
    * 
- * @param tagId - * @return + * + * @param tagId the tag id + * @return corp tag list + * @throws WxErrorException the wx error exception */ - WxCpUserExternalTagGroupList getCorpTagList(String [] tagId) throws WxErrorException; - + WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErrorException; /** *
    * 企业可通过此接口向客户标签库中添加新的标签组和标签,每个企业最多可配置3000个企业标签。
    * 暂不支持第三方调用。
    * 
- * @param tagGroup - * @return + * + * @param tagGroup the tag group + * @return wx cp user external tag group info + * @throws WxErrorException the wx error exception */ - WxCpUserExternalTagGroupInfo addCorpTag(WxCpUserExternalTagGroupInfo tagGroup)throws WxErrorException; + WxCpUserExternalTagGroupInfo addCorpTag(WxCpUserExternalTagGroupInfo tagGroup) throws WxErrorException; /** *
    * 企业可通过此接口编辑客户标签/标签组的名称或次序值。
    * 暂不支持第三方调用。
    * 
- * @param id - * @param name - * @param order - * @return + * + * @param id the id + * @param name the name + * @param order the order + * @return wx cp base resp + * @throws WxErrorException the wx error exception */ - WxCpBaseResp editCorpTag(String id,String name,Integer order)throws WxErrorException; + WxCpBaseResp editCorpTag(String id, String name, Integer order) throws WxErrorException; /** *
    * 企业可通过此接口删除客户标签库中的标签,或删除整个标签组。
    * 暂不支持第三方调用。
    * 
- * @param tagId - * @param groupId - * @return + * + * @param tagId the tag id + * @param groupId the group id + * @return wx cp base resp + * @throws WxErrorException the wx error exception */ - WxCpBaseResp delCorpTag(String [] tagId,String[] groupId)throws WxErrorException; + WxCpBaseResp delCorpTag(String[] tagId, String[] groupId) throws WxErrorException; /** *
    * 企业可通过此接口为指定成员的客户添加上由企业统一配置的标签。
    * https://work.weixin.qq.com/api/doc/90000/90135/92117
    * 
- * @param userid - * @param externalUserid - * @param addTag - * @param removeTag - * @return + * + * @param userid the userid + * @param externalUserid the external userid + * @param addTag the add tag + * @param removeTag the remove tag + * @return wx cp base resp + * @throws WxErrorException the wx error exception */ - WxCpBaseResp markTag(String userid,String externalUserid,String[] addTag,String [] removeTag)throws WxErrorException; + 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/WxCpUserService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpUserService.java index 8cc77a2d55..8cf5670f9b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpUserService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpUserService.java @@ -3,7 +3,7 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.bean.WxCpInviteResult; import me.chanjar.weixin.cp.bean.WxCpUser; -import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo; +import me.chanjar.weixin.cp.bean.external.WxCpUserExternalContactInfo; import java.util.List; import java.util.Map; 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 952391cf90..b64ec0e870 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 @@ -9,6 +9,7 @@ import me.chanjar.weixin.cp.api.WxCpExternalContactService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.*; +import me.chanjar.weixin.cp.bean.external.*; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; @@ -223,6 +224,12 @@ public WxCpMsgTemplateAddResult addMsgTemplate(WxCpMsgTemplate wxCpMsgTemplate) return WxCpMsgTemplateAddResult.fromJson(result); } + @Override + public void sendWelcomeMsg(WxCpWelcomeMsg msg) throws WxErrorException { + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(SEND_WELCOME_MSG); + this.mainService.post(url, msg.toJson()); + } + @Override public WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErrorException { JsonObject json = new JsonObject(); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java index 1627117d26..d6d401624f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.cp.api.WxCpUserService; import me.chanjar.weixin.cp.bean.WxCpInviteResult; import me.chanjar.weixin.cp.bean.WxCpUser; -import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo; +import me.chanjar.weixin.cp.bean.external.WxCpUserExternalContactInfo; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.util.List; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayInfo.java similarity index 99% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayInfo.java index 52ae978f32..21c2696b6f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayInfo.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayInfo.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayResult.java similarity index 82% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayResult.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayResult.java index 89d58454d9..609673a193 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpContactWayResult.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayResult.java @@ -1,7 +1,8 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.SerializedName; import lombok.Data; +import me.chanjar.weixin.cp.bean.WxCpBaseResp; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplate.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpMsgTemplate.java similarity index 60% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplate.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpMsgTemplate.java index a4abb87821..295eecb636 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplate.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpMsgTemplate.java @@ -1,10 +1,14 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.SerializedName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +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.util.json.WxCpGsonBuilder; import java.io.Serializable; @@ -14,6 +18,8 @@ * 企业群发消息任务 *

* Created by songfan on 2020/7/14. + * + * @author songfan */ @Data @Builder @@ -36,7 +42,7 @@ public class WxCpMsgTemplate implements Serializable { private Link link; - private Miniprogram miniprogram; + private MiniProgram miniprogram; public static WxCpMsgTemplate fromJson(String json) { return WxCpGsonBuilder.create().fromJson(json, WxCpMsgTemplate.class); @@ -46,36 +52,4 @@ public String toJson() { return WxCpGsonBuilder.create().toJson(this); } - @Data - public class Text { - private String content; - } - - @Data - public class Image { - - @SerializedName("media_id") - private String mediaId; - - @SerializedName("pic_url") - private String picUrl; - } - - @Data - public class Link { - private String title; - @SerializedName("picurl") - private String picUrl; - private String desc; - private String url; - } - - @Data - public class Miniprogram { - private String title; - @SerializedName("pic_media_id") - private String picMediaId; - private String appid; - private String page; - } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplateAddResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpMsgTemplateAddResult.java similarity index 92% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplateAddResult.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpMsgTemplateAddResult.java index 2e91ec0671..87e0be4467 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMsgTemplateAddResult.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpMsgTemplateAddResult.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.SerializedName; import lombok.Data; @@ -9,6 +9,8 @@ /** * Created by songfan on 2020/7/14. + * + * @author songfan */ @Data public class WxCpMsgTemplateAddResult implements Serializable { diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactInfo.java similarity index 98% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfo.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactInfo.java index 6e290ce063..c28326e849 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfo.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactInfo.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.SerializedName; import lombok.*; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactList.java similarity index 96% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactList.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactList.java index 25e42ffc4a..1320e38942 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactList.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactList.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java similarity index 90% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatInfo.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java index e5d8db7262..0c33309bca 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatInfo.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java @@ -1,8 +1,9 @@ -package me.chanjar.weixin.cp.bean; +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; @@ -13,7 +14,7 @@ */ @Getter @Setter -public class WxCpUserExternalGroupChatInfo extends WxCpBaseResp{ +public class WxCpUserExternalGroupChatInfo extends WxCpBaseResp { @SerializedName("group_chat") private GroupChat groupChat; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatList.java similarity index 90% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatList.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatList.java index 0a0e970efc..8215377e4f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatList.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatList.java @@ -1,8 +1,9 @@ -package me.chanjar.weixin.cp.bean; +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; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatStatistic.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatStatistic.java similarity index 62% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatStatistic.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatStatistic.java index 242ceb4f8b..dd57565321 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalGroupChatStatistic.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatStatistic.java @@ -1,10 +1,12 @@ -package me.chanjar.weixin.cp.bean; +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; /** @@ -15,73 +17,76 @@ */ @Getter @Setter -public class WxCpUserExternalGroupChatStatistic extends WxCpBaseResp{ +public class WxCpUserExternalGroupChatStatistic extends WxCpBaseResp implements Serializable { + private static final long serialVersionUID = -3548998672207956622L; @SerializedName("total") - int total; + private int total; @SerializedName("next_offset") - int nextOffset; + private int nextOffset; @SerializedName("items") - List itemList; + private List itemList; @Getter @Setter - public static class StatisticItem { + public static class StatisticItem implements Serializable { + private static final long serialVersionUID = -7272935708787587856L; @SerializedName("owner") - String owner; + private String owner; @SerializedName("data") - ItemData itemData; + private ItemData itemData; } @Getter @Setter - public static class ItemData { + public static class ItemData implements Serializable { + private static final long serialVersionUID = 354382008606856587L; /** * 新增客户群数量 */ @SerializedName("new_chat_cnt") - int newChatCnt; + private int newChatCnt; /** * 截至当天客户群总数量 */ @SerializedName("chat_total") - int chatTotal; + private int chatTotal; /** * 截至当天有发过消息的客户群数量 */ @SerializedName("chat_has_msg") - int chatHasMsg; + private int chatHasMsg; /** * 客户群新增群人数。 */ @SerializedName("new_member_cnt") - int newMemberCnt; + private int newMemberCnt; /** * 截至当天客户群总人数 */ @SerializedName("member_total") - int memberTotal; + private int memberTotal; /** * 截至当天有发过消息的群成员数 */ @SerializedName("member_has_msg") - int memberHasMsg; + private int memberHasMsg; /** * 截至当天客户群消息总数 */ @SerializedName("msg_total") - int msgTotal; + private int msgTotal; } public static WxCpUserExternalGroupChatStatistic fromJson(String json) { diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupInfo.java similarity index 94% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupInfo.java index d0aa9fe327..97ff3f2571 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupInfo.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupInfo.java @@ -1,9 +1,10 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import me.chanjar.weixin.cp.bean.WxCpBaseResp; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.util.List; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java similarity index 94% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupList.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java index f77433cb4b..bb15565161 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalTagGroupList.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java @@ -1,9 +1,10 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import me.chanjar.weixin.cp.bean.WxCpBaseResp; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.util.List; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUnassignList.java similarity index 86% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUnassignList.java index 650171a41d..2870eb15bc 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUnassignList.java @@ -1,8 +1,9 @@ -package me.chanjar.weixin.cp.bean; +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; @@ -14,7 +15,7 @@ */ @Getter @Setter -public class WxCpUserExternalUnassignList extends WxCpBaseResp{ +public class WxCpUserExternalUnassignList extends WxCpBaseResp { @SerializedName("info") private List unassignInfos; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUserBehaviorStatistic.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUserBehaviorStatistic.java similarity index 96% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUserBehaviorStatistic.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUserBehaviorStatistic.java index ced1c62db6..48fcbcba30 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUserBehaviorStatistic.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUserBehaviorStatistic.java @@ -1,8 +1,9 @@ -package me.chanjar.weixin.cp.bean; +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; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserWithExternalPermission.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserWithExternalPermission.java similarity index 93% rename from weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserWithExternalPermission.java rename to weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserWithExternalPermission.java index e64a273d74..3a5c366d76 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserWithExternalPermission.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserWithExternalPermission.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.cp.bean; +package me.chanjar.weixin.cp.bean.external; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; 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 new file mode 100644 index 0000000000..ce744b9f24 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java @@ -0,0 +1,40 @@ +package me.chanjar.weixin.cp.bean.external; + +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.util.json.WxCpGsonBuilder; + +import java.io.Serializable; + +/** + * 新客户欢迎语. + * + * @author Binary Wang + * @date 2020-08-16 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WxCpWelcomeMsg implements Serializable { + private static final long serialVersionUID = 4170843890468921757L; + + @SerializedName("welcome_code") + private String welcomeCode; + + private Text text; + + private Image image; + + private Link link; + + private MiniProgram miniprogram; + + public String toJson() { + return WxCpGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Image.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Image.java new file mode 100644 index 0000000000..084de7fcf2 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Image.java @@ -0,0 +1,23 @@ +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 2020-08-16 + */ +@Data +public class Image implements Serializable { + private static final long serialVersionUID = -606286372867787121L; + + @SerializedName("media_id") + private String mediaId; + + @SerializedName("pic_url") + private String picUrl; +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Link.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Link.java new file mode 100644 index 0000000000..a949a1a0f1 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Link.java @@ -0,0 +1,22 @@ +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 2020-08-16 + */ +@Data +public class Link implements Serializable { + private static final long serialVersionUID = -8041816740881163875L; + private String title; + @SerializedName("picurl") + private String picUrl; + private String desc; + private String url; +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/MiniProgram.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/MiniProgram.java new file mode 100644 index 0000000000..1c5940c7d6 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/MiniProgram.java @@ -0,0 +1,23 @@ +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 2020-08-16 + */ +@Data +public class MiniProgram implements Serializable { + private static final long serialVersionUID = 4242074162638170679L; + + private String title; + @SerializedName("pic_media_id") + private String picMediaId; + private String appid; + private String page; +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Text.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Text.java new file mode 100644 index 0000000000..2b5ae5fc63 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Text.java @@ -0,0 +1,17 @@ +package me.chanjar.weixin.cp.bean.external.msg; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 消息文本消息. + * + * @author Binary Wang + * @date 2020-08-16 + */ +@Data +public class Text implements Serializable { + private static final long serialVersionUID = 6608288753719551600L; + private String content; +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java index eb22bc4c79..9133a6ce3e 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java @@ -17,9 +17,11 @@ * 使用说明:本实现仅供参考,并不完整. * 比如为减少项目依赖,未加入redis分布式锁的实现,如有需要请自行实现。 *

+ * @deprecated 不建议使用,如有需要,请自行改造实现,加入到自己的项目中并引用 * * @author gaigeshen */ +@Deprecated public class WxCpRedisConfigImpl implements WxCpConfigStorage { private static final String ACCESS_TOKEN_KEY = "WX_CP_ACCESS_TOKEN"; private static final String ACCESS_TOKEN_EXPIRES_TIME_KEY = "WX_CP_ACCESS_TOKEN_EXPIRES_TIME"; 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 7f734a89b5..6b5e9444c4 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 @@ -132,6 +132,7 @@ public static class ExternalContact { public static final String LIST_USER_BEHAVIOR_DATA = "/cgi-bin/externalcontact/get_user_behavior_data"; public static final String LIST_GROUP_CHAT_DATA = "/cgi-bin/externalcontact/groupchat/statistic"; public static final String ADD_MSG_TEMPLATE = "/cgi-bin/externalcontact/add_msg_template"; + public static final String SEND_WELCOME_MSG = "/cgi-bin/externalcontact/send_welcome_msg"; public static final String GET_CORP_TAG_LIST = "/cgi-bin/externalcontact/get_corp_tag_list"; public static final String ADD_CORP_TAG = "/cgi-bin/externalcontact/add_corp_tag"; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java index 2d7e27da9d..fd159d1755 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpConclusionAdapter.java @@ -1,7 +1,7 @@ package me.chanjar.weixin.cp.util.json; import com.google.gson.*; -import me.chanjar.weixin.cp.bean.WxCpContactWayInfo; +import me.chanjar.weixin.cp.bean.external.WxCpContactWayInfo; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Type; 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 3997e2d00c..9a0fbdbd3d 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 @@ -5,7 +5,8 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.api.ApiTestModule; import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.bean.*; +import me.chanjar.weixin.cp.bean.WxCpBaseResp; +import me.chanjar.weixin.cp.bean.external.*; import org.apache.commons.lang3.time.DateFormatUtils; import org.testng.annotations.Guice; import org.testng.annotations.Test; @@ -22,7 +23,7 @@ public class WxCpExternalContactServiceImplTest { private WxCpService wxCpService; @Inject protected ApiTestModule.WxXmlCpInMemoryConfigStorage configStorage; - private String userId = "someone" + System.currentTimeMillis(); + private final String userId = "someone" + System.currentTimeMillis(); @Test public void testGetExternalContact() throws WxErrorException { @@ -111,7 +112,7 @@ public void testGetContactDetail() throws WxErrorException { @Test public void testGetCorpTagList() throws WxErrorException { - String tag[]={}; + String[] tag = {}; WxCpUserExternalTagGroupList result = this.wxCpService.getExternalContactService().getCorpTagList(null); System.out.println(result); assertNotNull(result); @@ -121,7 +122,7 @@ public void testGetCorpTagList() throws WxErrorException { public void testAddCorpTag() throws WxErrorException { List list = new ArrayList<>(); - WxCpUserExternalTagGroupInfo.Tag tag = new WxCpUserExternalTagGroupInfo.Tag(); + WxCpUserExternalTagGroupInfo.Tag tag = new WxCpUserExternalTagGroupInfo.Tag(); tag.setName("测试标签20"); tag.setOrder(1); list.add(tag); @@ -151,10 +152,10 @@ public void testEditCorpTag() throws WxErrorException { @Test public void testDelCorpTag() throws WxErrorException { - String tagId[] = {}; - String groupId[] = {"et2omCCwAAM3WzL00QpK9xARab3HGkAg"}; + String[] tagId = {}; + String[] groupId = {"et2omCCwAAM3WzL00QpK9xARab3HGkAg"}; - WxCpBaseResp result = this.wxCpService.getExternalContactService().delCorpTag(tagId,groupId); + WxCpBaseResp result = this.wxCpService.getExternalContactService().delCorpTag(tagId, groupId); System.out.println(result); assertNotNull(result); @@ -163,15 +164,57 @@ public void testDelCorpTag() throws WxErrorException { @Test public void testMarkTag() throws WxErrorException { - String userid="HuangXiaoMing"; - String externalUserid="wo2omCCwAAzR0Rt1omz-90o_XJkPGXIQ"; - String addTag[] = {"et2omCCwAAzdcSK-RV80YS9sbpCXlNlQ"}; - String removeTag[] = {}; + String userid = "HuangXiaoMing"; + String externalUserid = "wo2omCCwAAzR0Rt1omz-90o_XJkPGXIQ"; + String[] addTag = {"et2omCCwAAzdcSK-RV80YS9sbpCXlNlQ"}; + String[] removeTag = {}; - WxCpBaseResp result = this.wxCpService.getExternalContactService().markTag(userid,externalUserid,addTag,removeTag); + WxCpBaseResp result = this.wxCpService.getExternalContactService().markTag(userid, externalUserid, addTag, removeTag); System.out.println(result); assertNotNull(result); } + @Test + public void testDeleteContactWay() { + } + + @Test + public void testListFollowers() { + } + + @Test + public void testListUnassignedList() { + } + + @Test + public void testTransferExternalContact() { + } + + @Test + public void testListGroupChat() { + } + + @Test + public void testGetGroupChat() { + } + + @Test + public void testGetUserBehaviorStatistic() { + } + + @Test + public void testGetGroupChatStatistic() { + } + + @Test + public void testAddMsgTemplate() { + } + + @Test + public void testSendWelcomeMsg() throws WxErrorException { + this.wxCpService.getExternalContactService().sendWelcomeMsg(WxCpWelcomeMsg.builder() + .welcomeCode("abc") + .build()); + } } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfoTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfoTest.java index 3c1b327cd3..77b25f9198 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfoTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpUserExternalContactInfoTest.java @@ -2,6 +2,7 @@ import java.util.List; +import me.chanjar.weixin.cp.bean.external.WxCpUserExternalContactInfo; import org.testng.annotations.*; import static org.assertj.core.api.Assertions.assertThat; From 9145628c7a45dcc78afd974fa659d828279c1316 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 16 Aug 2020 14:41:38 +0800 Subject: [PATCH 75/90] =?UTF-8?q?:art:=20#1631=20SDK=E6=9C=80=E4=BD=8E?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=89=88=E6=9C=AC=E8=AE=BE=E7=BD=AE=E4=B8=BA?= =?UTF-8?q?JDK8=EF=BC=8C=E6=94=BE=E5=BC=83=E5=AF=B9JDK7=E5=8F=8A=E6=9B=B4?= =?UTF-8?q?=E6=97=A7=E7=89=88=E6=9C=AC=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 1e55e3c7d6..5a61b18324 100644 --- a/pom.xml +++ b/pom.xml @@ -116,8 +116,8 @@ - 1.7 - 1.7 + 1.8 + 1.8 UTF-8 4.5 @@ -131,11 +131,10 @@ qrcode-utils 1.1 - org.jodd jodd-http - 5.1.4 + 5.1.6 provided From 79f00925a741f135b6e60e4c57a449749fe57a15 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 16 Aug 2020 15:06:09 +0800 Subject: [PATCH 76/90] =?UTF-8?q?:new:=20#1267=20=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0=E5=A4=9A=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=88=87=E6=8D=A2=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/api/WxMaService.java | 53 +++++++++++++- .../miniapp/api/impl/BaseWxMaServiceImpl.java | 73 ++++++++++++++++++- .../wx/miniapp/util/WxMaConfigHolder.java | 31 ++++++++ 3 files changed, 151 insertions(+), 6 deletions(-) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.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 f73d918997..b6fb72efe7 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 @@ -10,6 +10,8 @@ import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.RequestHttp; +import java.util.Map; + /** * @author Binary Wang */ @@ -148,9 +150,56 @@ public interface WxMaService extends WxService { /** * 注入 {@link WxMaConfig} 的实现. * - * @param wxConfigProvider config + * @param maConfig config + */ + void setWxMaConfig(WxMaConfig maConfig); + + /** + * Map里 加入新的 {@link WxMaConfig},适用于动态添加新的微信公众号配置. + * + * @param miniappId 小程序标识 + * @param configStorage 新的微信配置 + */ + void addConfig(String miniappId, WxMaConfig configStorage); + + /** + * 从 Map中 移除 {@link String miniappId} 所对应的 {@link WxMaConfig},适用于动态移除小程序配置. + * + * @param miniappId 对应小程序的标识 + */ + void removeConfig(String miniappId); + + /** + * 注入多个 {@link WxMaConfig} 的实现. 并为每个 {@link WxMaConfig} 赋予不同的 {@link String mpId} 值 + * 随机采用一个{@link String mpId}进行Http初始化操作 + * + * @param configs WxMaConfig map + */ + void setMultiConfigs(Map configs); + + /** + * 注入多个 {@link WxMaConfig} 的实现. 并为每个 {@link WxMaConfig} 赋予不同的 {@link String label} 值 + * + * @param configs WxMaConfig map + * @param defaultMiniappId 设置一个{@link WxMaConfig} 所对应的{@link String defaultMiniappId}进行Http初始化 + */ + void setMultiConfigs(Map configs, String defaultMiniappId); + + /** + * 进行相应的公众号切换. + * + * @param mpId 公众号标识 + * @return 切换是否成功 + */ + boolean switchover(String mpId); + + /** + * 进行相应的公众号切换. + * + * @param miniappId 小程序标识 + * @return 切换成功,则返回当前对象,方便链式调用,否则抛出异常 */ - void setWxMaConfig(WxMaConfig wxConfigProvider); + WxMaService switchoverTo(String miniappId); /** * 返回消息(客服消息和模版消息)发送接口方法实现类,以方便调用其各个接口. 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 6e7b04da19..fc04b5b6f4 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 @@ -3,15 +3,17 @@ import cn.binarywang.wx.miniapp.api.*; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.config.WxMaConfig; +import cn.binarywang.wx.miniapp.util.WxMaConfigHolder; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxImgProcService; -import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; +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.DataUtils; @@ -38,7 +40,7 @@ */ @Slf4j public abstract class BaseWxMaServiceImpl implements WxMaService, RequestHttp { - + private Map configMap; private WxMaConfig wxMaConfig; private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this); @@ -300,11 +302,74 @@ public WxMaConfig getWxMaConfig() { } @Override - public void setWxMaConfig(WxMaConfig wxConfigProvider) { - this.wxMaConfig = wxConfigProvider; + public void setWxMaConfig(WxMaConfig maConfig) { + final String appid = maConfig.getAppid(); + this.setMultiConfigs(ImmutableMap.of(appid, maConfig), appid); + } + + @Override + public void setMultiConfigs(Map configs) { + this.setMultiConfigs(configs, configs.keySet().iterator().next()); + } + + @Override + public void setMultiConfigs(Map configs, String defaultMiniappId) { + this.configMap = Maps.newHashMap(configs); + WxMaConfigHolder.set(defaultMiniappId); this.initHttp(); } + @Override + public void addConfig(String mpId, WxMaConfig configStorages) { + synchronized (this) { + if (this.configMap == null) { + this.setWxMaConfig(configStorages); + } else { + this.configMap.put(mpId, configStorages); + } + } + } + + @Override + public void removeConfig(String miniappId) { + synchronized (this) { + if (this.configMap.size() == 1) { + this.configMap.remove(miniappId); + log.warn("已删除最后一个小程序配置:{},须立即使用setWxMaConfig或setMultiConfigs添加配置", miniappId); + return; + } + if (WxMaConfigHolder.get().equals(miniappId)) { + this.configMap.remove(miniappId); + final String defaultMpId = this.configMap.keySet().iterator().next(); + WxMaConfigHolder.set(defaultMpId); + log.warn("已删除默认小程序配置,小程序【{}】被设为默认配置", defaultMpId); + return; + } + this.configMap.remove(miniappId); + } + } + + @Override + public WxMaService switchoverTo(String miniappId) { + if (this.configMap.containsKey(miniappId)) { + WxMaConfigHolder.set(miniappId); + return this; + } + + throw new RuntimeException(String.format("无法找到对应【%s】的小程序配置信息,请核实!", miniappId)); + } + + @Override + public boolean switchover(String mpId) { + if (this.configMap.containsKey(mpId)) { + WxMaConfigHolder.set(mpId); + return true; + } + + log.error("无法找到对应【{}】的小程序配置信息,请核实!", mpId); + return false; + } + @Override public void setRetrySleepMillis(int retrySleepMillis) { this.retrySleepMillis = retrySleepMillis; 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 new file mode 100644 index 0000000000..e73cb2282d --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java @@ -0,0 +1,31 @@ +package cn.binarywang.wx.miniapp.util; + +/** + * 小程序存储值存放类. + * + * @author Binary Wang + * @date 2020-08-16 + */ +public class WxMaConfigHolder { + private final static ThreadLocal THREAD_LOCAL = new ThreadLocal() { + @Override + protected String initialValue() { + return "default"; + } + }; + + public static String get() { + return THREAD_LOCAL.get(); + } + + public static void set(String label) { + THREAD_LOCAL.set(label); + } + + /** + * 此方法需要用户根据自己程序代码,在适当位置手动触发调用,本SDK里无法判断调用时机 + */ + public static void remove() { + THREAD_LOCAL.remove(); + } +} From 43633aacc25ea1a380791c1f65043e03f52e5c2b Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 16 Aug 2020 15:29:47 +0800 Subject: [PATCH 77/90] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=203.8.9.B?= =?UTF-8?q?=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 +- 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 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 5a61b18324..5b530f15af 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.8.8.B + 3.8.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 078378c535..774540b759 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.8.B + 3.8.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 26923a761a..cbc8f5a0db 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.8.B + 3.8.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 0e3fbbc006..10fecdc1fc 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.8.B + 3.8.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 d63e8a0d3c..104fdcdd2e 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.8.B + 3.8.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 912197018b..4a0b52f740 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.8.B + 3.8.9.B 4.0.0 diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml index 32712bf6f1..946075570b 100644 --- a/weixin-graal/pom.xml +++ b/weixin-graal/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.8.B + 3.8.9.B weixin-graal diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 9abb8e3530..1703fa47c2 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.8.B + 3.8.9.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 86bd5b74c6..b23435f4ab 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.8.B + 3.8.9.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 8a93d96537..bbcd43e8db 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.8.B + 3.8.9.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index c0c2e40d5d..34bee7fcf8 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.8.B + 3.8.9.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 8f90f6af05..f24c81186a 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.8.B + 3.8.9.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 82ed2af51b..5bb8953432 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.8.8.B + 3.8.9.B 4.0.0 From a2783832d4c8eaf0cd08632b987e60084c3c65e5 Mon Sep 17 00:00:00 2001 From: cloudX Date: Mon, 17 Aug 2020 16:09:11 +0800 Subject: [PATCH 78/90] =?UTF-8?q?:art:=20#1716=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E8=AF=81=E4=B9=A6=E9=85=8D=E7=BD=AE=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9C=AC=E5=9C=B0=E8=B7=AF=E5=BE=84=E5=92=8C=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 曾浩 --- .../binarywang/wxpay/config/WxPayConfig.java | 131 ++++++++---------- 1 file changed, 56 insertions(+), 75 deletions(-) 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 f5cd91c6c3..097a0fa0c7 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 @@ -115,8 +115,6 @@ public class WxPayConfig { * apiV3 证书序列号值 */ private String certSerialNo; - - /** * 微信支付分serviceId */ @@ -128,8 +126,10 @@ public class WxPayConfig { private String payScoreNotifyUrl; private CloseableHttpClient apiV3HttpClient; - - + /** + * 私钥信息 + */ + private PrivateKey privateKey; /** * p12证书文件内容的字节数组. */ @@ -197,44 +197,7 @@ public SSLContext initSSLContext() throws WxPayException { if (StringUtils.isBlank(this.getKeyPath())) { throw new WxPayException("请确保证书文件地址keyPath已配置"); } - - final String prefix = "classpath:"; - String fileHasProblemMsg = String.format(PROBLEM_MSG, this.getKeyPath()); - String fileNotFoundMsg = String.format(NOT_FOUND_MSG, this.getKeyPath()); - if (this.getKeyPath().startsWith(prefix)) { - String path = RegExUtils.removeFirst(this.getKeyPath(), prefix); - if (!path.startsWith("/")) { - path = "/" + path; - } - try { - inputStream = ResourcesUtil.getResourceAsStream(path); - if (inputStream == null) { - throw new WxPayException(fileNotFoundMsg); - } - } catch (Exception e) { - throw new WxPayException(fileNotFoundMsg, e); - } - } else if (this.getKeyPath().startsWith("http://") || this.getKeyPath().startsWith("https://")) { - try { - inputStream = new URL(this.keyPath).openStream(); - if (inputStream == null) { - throw new WxPayException(fileNotFoundMsg); - } - } catch (IOException e) { - throw new WxPayException(fileNotFoundMsg, e); - } - } else { - try { - File file = new File(this.getKeyPath()); - if (!file.exists()) { - throw new WxPayException(fileNotFoundMsg); - } - - inputStream = new FileInputStream(file); - } catch (IOException e) { - throw new WxPayException(fileHasProblemMsg, e); - } - } + inputStream = this.loadConfigInputStream(this.getKeyPath()); } try { @@ -275,39 +238,8 @@ public CloseableHttpClient initApiV3HttpClient() throws WxPayException { throw new WxPayException("请确保apiV3Key值已设置"); } - InputStream keyInputStream = null; - InputStream certInputStream = null; - final String prefix = "classpath:"; - if (privateKeyPath.startsWith(prefix)) { - String keypath = RegExUtils.removeFirst(privateKeyPath, prefix); - if (!keypath.startsWith("/")) { - keypath = "/" + keypath; - } - try { - keyInputStream = ResourcesUtil.getResourceAsStream(keypath); - if (keyInputStream == null) { - throw new WxPayException(String.format(NOT_FOUND_MSG, this.getPrivateKeyPath())); - } - } catch (Exception e) { - throw new WxPayException(String.format(NOT_FOUND_MSG, this.getPrivateKeyPath()), e); - } - } - - if (privateCertPath.startsWith(prefix)) { - String certpath = RegExUtils.removeFirst(privateCertPath, prefix); - if (!certpath.startsWith("/")) { - certpath = "/" + certpath; - } - try { - certInputStream = ResourcesUtil.getResourceAsStream(certpath); - if (certInputStream == null) { - throw new WxPayException(String.format(NOT_FOUND_MSG, this.getPrivateCertPath())); - } - } catch (Exception e) { - throw new WxPayException(String.format(NOT_FOUND_MSG, this.getPrivateCertPath()), e); - } - } - + InputStream keyInputStream = this.loadConfigInputStream(privateKeyPath); + InputStream certInputStream = this.loadConfigInputStream(privateCertPath); try { PrivateKey merchantPrivateKey = PemUtils.loadPrivateKey(keyInputStream); @@ -323,10 +255,59 @@ public CloseableHttpClient initApiV3HttpClient() throws WxPayException { .build(); this.apiV3HttpClient = httpClient; this.verifier=verifier; + this.privateKey = merchantPrivateKey; return httpClient; } catch (Exception e) { throw new WxPayException("v3请求构造异常!", e); } } + + /** + * 从配置路径 加载配置 信息(支持 classpath、本地路径、网络url) + * @param configPath 配置路径 + * @return + * @throws WxPayException + */ + private InputStream loadConfigInputStream(String configPath) throws WxPayException { + InputStream inputStream; + final String prefix = "classpath:"; + String fileHasProblemMsg = String.format(PROBLEM_MSG, configPath); + String fileNotFoundMsg = String.format(NOT_FOUND_MSG, configPath); + if (configPath.startsWith(prefix)) { + String path = RegExUtils.removeFirst(configPath, prefix); + if (!path.startsWith("/")) { + path = "/" + path; + } + try { + inputStream = ResourcesUtil.getResourceAsStream(path); + if (inputStream == null) { + throw new WxPayException(fileNotFoundMsg); + } + } catch (Exception e) { + throw new WxPayException(fileNotFoundMsg, e); + } + } else if (configPath.startsWith("http://") || configPath.startsWith("https://")) { + try { + inputStream = new URL(configPath).openStream(); + if (inputStream == null) { + throw new WxPayException(fileNotFoundMsg); + } + } catch (IOException e) { + throw new WxPayException(fileNotFoundMsg, e); + } + } else { + try { + File file = new File(configPath); + if (!file.exists()) { + throw new WxPayException(fileNotFoundMsg); + } + + inputStream = new FileInputStream(file); + } catch (IOException e) { + throw new WxPayException(fileHasProblemMsg, e); + } + } + return inputStream; + } } From 17c20422e22bddc140baf45904f85427f6965166 Mon Sep 17 00:00:00 2001 From: cloudX Date: Tue, 18 Aug 2020 10:19:16 +0800 Subject: [PATCH 79/90] =?UTF-8?q?:new:=20#1667=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=A2=9E=E5=8A=A0=E7=94=B5=E5=95=86=E6=94=B6?= =?UTF-8?q?=E4=BB=98=E9=80=9A-=E4=BA=8C=E7=BA=A7=E5=95=86=E6=88=B7?= =?UTF-8?q?=E8=BF=9B=E4=BB=B6=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 电商收付通二级商户进件 Co-authored-by: 曾浩 --- .../bean/ecommerce/ApplymentsRequest.java | 796 ++++++++++++++++++ .../bean/ecommerce/ApplymentsResult.java | 43 + .../ecommerce/ApplymentsStatusResult.java | 308 +++++++ .../binarywang/wxpay/config/WxPayConfig.java | 9 +- .../wxpay/service/EcommerceService.java | 55 ++ .../wxpay/service/WxPayService.java | 6 + .../service/impl/BaseWxPayServiceImpl.java | 6 + .../service/impl/EcommerceServiceImpl.java | 52 ++ .../wxpay/v3/util/RsaCryptoUtil.java | 4 +- 9 files changed, 1274 insertions(+), 5 deletions(-) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java new file mode 100644 index 0000000000..92e069f631 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java @@ -0,0 +1,796 @@ +package com.github.binarywang.wxpay.bean.ecommerce; + +import com.github.binarywang.wxpay.v3.SpecEncrypt; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + + +/** + *
+ * 电商平台,可使用该接口,帮助其二级商户进件成为微信支付商户。
+ * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_1.shtml
+ * 
+ */ +@Data +@NoArgsConstructor +public class ApplymentsRequest implements Serializable { + /** + *
+	 * 字段名:业务申请编号
+	 * 变量名:out_request_no
+	 * 是否必填:是
+	 * 类型:string(124)
+	 * 描述:
+	 *  1、服务商自定义的商户唯一编号。
+	 *  2、每个编号对应一个申请单,每个申请单审核通过后会生成一个微信支付商户号。
+	 *  3、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息 。
+	 *  示例值:APPLYMENT_00000000001
+	 * 
+ */ + @SerializedName(value = "out_request_no") + private String outRequestNo; + + /** + *
+	 * 字段名:主体类型
+	 * 变量名:organization_type
+	 * 是否必填:是
+	 * 类型:string(4)
+	 * 描述:
+	 *  枚举值:
+	 *  2401:小微商户,指无营业执照的商户。
+	 *  4:个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。
+	 *  2:企业,营业执照上的主体类型一般为有限公司、有限责任公司。
+	 *  3:党政、机关及事业单位,包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构)。
+	 *  1708:其他组织,不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。
+	 *  示例值:2401
+	 * 
+ */ + @SerializedName(value = "organization_type") + private String organizationType; + + /** + *
+	 * 字段名:+营业执照/登记证书信息
+	 * 变量名:business_license_info
+	 * 是否必填:条件选填
+	 * 类型:object
+	 * 描述:
+	 *  1、主体为“小微”时,不填。
+	 *  2、主体为“个体工商户/企业”时,请上传营业执照。
+	 *  3、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书。
+	 * 
+ */ + @SerializedName(value = "business_license_info") + private BusinessLicenseInfo businessLicenseInfo; + + /** + *
+	 * 字段名:+组织机构代码证信息
+	 * 变量名:organization_cert_info
+	 * 是否必填:条件选填
+	 * 类型:object
+	 * 描述:主体为企业/党政、机关及事业单位/其他组织,且证件号码不是18位时必填。
+	 * 
+ */ + @SerializedName(value = "organization_cert_info") + private OrganizationCertInfo organizationCertInfo; + + /** + *
+	 * 字段名:经营者/法人证件类型
+	 * 变量名:id_doc_type
+	 * 是否必填:否
+	 * 类型:string(64)
+	 * 描述:
+	 *  1、主体为“小微”,只可选择:身份证。
+	 *  2、主体为“个体户/企业/党政、机关及事业单位/其他组织”,可选择:任一证件类型。
+	 *  3、若没有填写,系统默认选择:身份证。
+	 *  枚举值:
+	 *  IDENTIFICATION_TYPE_MAINLAND_IDCARD:中国大陆居民-身份证
+	 *  IDENTIFICATION_TYPE_OVERSEA_PASSPORT:其他国家或地区居民-护照
+	 *  IDENTIFICATION_TYPE_HONGKONG:中国香港居民–来往内地通行证
+	 *  IDENTIFICATION_TYPE_MACAO:中国澳门居民–来往内地通行证
+	 *  IDENTIFICATION_TYPE_TAIWAN:中国台湾居民–来往大陆通行证
+	 *  示例值:IDENTIFICATION_TYPE_MACAO
+	 * 
+ */ + @SerializedName(value = "id_doc_type") + private String idDocType; + + /** + *
+	 * 字段名:+经营者/法人身份证信息
+	 * 变量名:id_card_info
+	 * 是否必填:条件选填
+	 * 类型:object
+	 * 描述:
+	 *  请填写经营者/法人的身份证信息
+	 *  证件类型为“身份证”时填写。
+	 *
+	 * 
+ */ + @SerializedName(value = "id_card_info") + @SpecEncrypt + private IdCardInfo idCardInfo; + + /** + *
+	 * 字段名:+经营者/法人其他类型证件信息
+	 * 变量名:id_doc_info
+	 * 是否必填:条件选填
+	 * 类型:object
+	 * 描述:证件类型为“来往内地通行证、来往大陆通行证、护照”时填写。
+	 * 
+ */ + @SerializedName(value = "id_doc_info") + private IdDocInfo idDocInfo; + + /** + *
+	 * 字段名:是否填写结算账户信息
+	 * 变量名:need_account_info
+	 * 是否必填:是
+	 * 类型:bool
+	 * 描述:
+	 *  可根据实际情况,填写“true”或“false”。
+	 *  1、若为“true”,则需填写结算账户信息。
+	 *  2、若为“false”,则无需填写结算账户信息。
+	 *  示例值:true
+	 * 
+ */ + @SerializedName(value = "need_account_info") + private Boolean needAccountInfo; + + /** + *
+	 * 字段名:+结算账户信息
+	 * 变量名:account_info
+	 * 是否必填:条件选填
+	 * 类型:object
+	 * 描述:若"是否填写结算账户信息"填写为“true”, 则必填,填写为“false”不填 。
+	 * 
+ */ + @SerializedName(value = "account_info") + @SpecEncrypt + private AccountInfo accountInfo; + + /** + *
+	 * 字段名:+超级管理员信息
+	 * 变量名:contact_info
+	 * 是否必填:是
+	 * 类型:object
+	 * 描述:
+	 *  请填写店铺的超级管理员信息。
+	 *  超级管理员需在开户后进行签约,并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。
+	 * 
+ */ + @SerializedName(value = "contact_info") + @SpecEncrypt + private ContactInfo contactInfo; + + /** + *
+	 * 字段名:+店铺信息
+	 * 变量名:sales_scene_info
+	 * 是否必填:是
+	 * 类型:object
+	 * 描述:请填写店铺信息
+	 * 
+ */ + @SerializedName(value = "sales_scene_info") + private SalesSceneInfo salesSceneInfo; + + /** + *
+	 * 字段名:商户简称
+	 * 变量名:merchant_shortname
+	 * 是否必填:是
+	 * 类型:string(64)
+	 * 描述:
+	 *  UTF-8格式,中文占3个字节,即最多16个汉字长度。将在支付完成页向买家展示,需与商家的实际售卖商品相符 。
+	 *  示例值:腾讯
+	 * 
+ */ + @SerializedName(value = "merchant_shortname") + private String merchantShortname; + + /** + *
+	 * 字段名:特殊资质
+	 * 变量名:qualifications
+	 * 是否必填:否
+	 * 类型:string(1024)
+	 * 描述:
+	 *  1、若店铺业务包含互联网售药,则需上传特殊资质-《互联网药品交易服务证》。
+	 *  2、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+	 *  示例值:[\"jTpGmxUX3FBWVQ5NJInE4d2I6_H7I4\"]
+	 * 
+ */ + @SerializedName(value = "qualifications") + private String qualifications; + + /** + *
+	 * 字段名:补充材料
+	 * 变量名:business_addition_pics
+	 * 是否必填:否
+	 * 类型:string(1024)
+	 * 描述:
+	 *   最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+	 *  示例值:[\"jTpGmg05InE4d2I6_H7I4\"]
+	 * 
+ */ + @SerializedName(value = "business_addition_pics") + private String businessAdditionPics; + + /** + *
+	 * 字段名:补充说明
+	 * 变量名:business_addition_desc
+	 * 是否必填:否
+	 * 类型:string(256)
+	 * 描述:
+	 *   可填写512字以内 。
+	 *  示例值:特殊情况,说明原因
+	 * 
+ */ + @SerializedName(value = "business_addition_desc") + private String businessAdditionDesc; + + @Data + @NoArgsConstructor + public static class BusinessLicenseInfo implements Serializable{ + /** + *
+		 * 字段名:证件扫描件
+		 * 变量名:business_license_copy
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、主体为“个体工商户/企业”时,请上传营业执照的证件图片。
+		 *  2、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书的证件图片。
+		 *  3、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+		 *  4、图片要求:
+		 *  (1)请上传证件的彩色扫描件或彩色数码拍摄件,黑白复印件需加盖公章(公章信息需完整) 。
+		 *  (2)不得添加无关水印(非微信支付商户申请用途的其他水印)。
+		 *  (3)需提供证件的正面拍摄件,完整、照面信息清晰可见。信息不清晰、扭曲、压缩变形、反光、不完整均不接受。
+		 *  (4)不接受二次剪裁、翻拍、PS的证件照片。
+		 *  示例值: 47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
+		 * 
+ */ + @SerializedName(value = "business_license_copy") + private String businessLicenseCopy; + + /** + *
+		 * 字段名:证件注册号
+		 * 变量名:business_license_number
+		 * 是否必填:是
+		 * 类型:string(18)
+		 * 描述:
+		 *  1、主体为“个体工商户/企业”时,请填写营业执照上的注册号/统一社会信用代码,须为15位数字或 18位数字|大写字母。
+		 *  2、主体为“党政、机关及事业单位/其他组织”时,请填写登记证书的证书编号。
+		 *  示例值:123456789012345678
+		 *  特殊规则:长度最小15个字节
+		 * 
+ */ + @SerializedName(value = "business_license_number") + private String businessLicenseNumber; + + /** + *
+		 * 字段名:商户名称
+		 * 变量名:merchant_name
+		 * 是否必填:是
+		 * 类型:string(128)
+		 * 描述:
+		 *  1、请填写营业执照/登记证书的商家名称,2~110个字符,支持括号 。
+		 *  2、个体工商户/党政、机关及事业单位,不能以“公司”结尾。
+		 *  3、个体工商户,若营业执照上商户名称为空或为“无”,请填写"个体户+经营者姓名",如“个体户张三” 。
+		 *  示例值:腾讯科技有限公司
+		 * 
+ */ + @SerializedName(value = "merchant_name") + private String merchantName; + + /** + *
+		 * 字段名:经营者/法定代表人姓名
+		 * 变量名:legal_person
+		 * 是否必填:是
+		 * 类型:string(128)
+		 * 描述:
+		 *  请填写证件的经营者/法定代表人姓名
+		 *  示例值:张三
+		 * 
+ */ + @SerializedName(value = "legal_person") + private String legalPerson; + + /** + *
+		 * 字段名:注册地址
+		 * 变量名:company_address
+		 * 是否必填:条件选填
+		 * 类型:string(128)
+		 * 描述:
+		 *  主体为“党政、机关及事业单位/其他组织”时必填,请填写登记证书的注册地址。
+		 *  示例值:深圳南山区科苑路
+		 * 
+ */ + @SerializedName(value = "company_address") + private String companyAddress; + + /** + *
+		 * 字段名:营业期限
+		 * 变量名:business_time
+		 * 是否必填:条件选填
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、主体为“党政、机关及事业单位/其他组织”时必填,请填写证件有效期。
+		 *  2、若证件有效期为长期,请填写:长期。
+		 *  3、结束时间需大于开始时间。
+		 *  4、有效期必须大于60天,即结束时间距当前时间需超过60天。
+		 *  示例值:[\"2014-01-01\",\"长期\"]
+		 * 
+ */ + @SerializedName(value = "business_time") + private String businessTime; + + } + + @Data + @NoArgsConstructor + public static class OrganizationCertInfo implements Serializable { + /** + *
+		 * 字段名:组织机构代码证照片
+		 * 变量名:organization_copy
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
+		 *  示例值:vByf3Gjm7KE53JXv\prrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
+		 * 
+ */ + @SerializedName(value = "organization_copy") + private String organizationCopy; + + /** + *
+		 * 字段名:组织机构代码
+		 * 变量名:organization_number
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、请填写组织机构代码证上的组织机构代码。
+		 *  2、可填写9或10位 数字|字母|连字符。
+		 *  示例值:12345679-A
+		 * 
+ */ + @SerializedName(value = "organization_number") + private String organizationNumber; + + /** + *
+		 * 字段名:组织机构代码有效期限
+		 * 变量名:organization_time
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、请填写组织机构代码证的有效期限,注意参照示例中的格式。
+		 *  2、若证件有效期为长期,请填写:长期。
+		 *  3、结束时间需大于开始时间。
+		 *  4、有效期必须大于60天,即结束时间距当前时间需超过60天。
+		 *  示例值:[\"2014-01-01\",\"长期\"]
+		 * 
+ */ + @SerializedName(value = "organization_time") + private String organizationTime; + + } + + @Data + @NoArgsConstructor + public static class IdCardInfo implements Serializable { + /** + *
+		 * 字段名:身份证人像面照片
+		 * 变量名:id_card_copy
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、请上传经营者/法定代表人的身份证人像面照片。
+		 *  2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
+		 *  示例值:xpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
+		 * 
+ */ + @SerializedName(value = "id_card_copy") + private String idCardCopy; + + /** + *
+		 * 字段名:身份证国徽面照片
+		 * 变量名:id_card_national
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、请上传经营者/法定代表人的身份证国徽面照片。
+		 *  2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+		 *  示例值:vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
+		 * 
+ */ + @SerializedName(value = "id_card_national") + private String idCardNational; + + /** + *
+		 * 字段名:身份证姓名
+		 * 变量名:id_card_name
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、请填写经营者/法定代表人对应身份证的姓名,2~30个中文字符、英文字符、符号。
+		 *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+		 *  示例值:pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==
+		 *  字段加密:使用APIv3定义的方式加密
+		 * 
+ */ + @SerializedName(value = "id_card_name") + @SpecEncrypt + private String idCardName; + + /** + *
+		 * 字段名:身份证号码
+		 * 变量名:id_card_number
+		 * 是否必填:是
+		 * 类型:string(18)
+		 * 描述:
+		 *  1、请填写经营者/法定代表人对应身份证的号码。
+		 *  2、15位数字或17位数字+1位数字|X ,该字段需进行加密处理,加密方法详见敏感信息加密说明。
+		 *  示例值:zV+BEmytMNQCqQ8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==4
+		 *  特殊规则:长度最小15个字节
+		 * 
+ */ + @SerializedName(value = "id_card_number") + @SpecEncrypt + private String idCardNumber; + + /** + *
+		 * 字段名:身份证有效期限
+		 * 变量名:id_card_valid_time
+		 * 是否必填:是
+		 * 类型:string(128)
+		 * 描述:
+		 *  1、请填写身份证有效期的结束时间,注意参照示例中的格式。
+		 *  2、若证件有效期为长期,请填写:长期。
+		 *  3、证件有效期需大于60天。
+		 *  示例值:2026-06-06,长期
+		 * 
+ */ + @SerializedName(value = "id_card_valid_time") + private String idCardValidTime; + + } + + @Data + @NoArgsConstructor + public static class IdDocInfo implements Serializable { + /** + *
+		 * 字段名:证件姓名
+		 * 变量名:id_doc_name
+		 * 是否必填:是
+		 * 类型:string(128)
+		 * 描述:
+		 *  请填写经营者/法人姓名。
+		 *  示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4LC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
+		 * 
+ */ + @SerializedName(value = "id_doc_name") + private String idDocName; + + /** + *
+		 * 字段名:证件号码
+		 * 变量名:id_doc_number
+		 * 是否必填:是
+		 * 类型:string(128)
+		 * 描述:
+		 *  7~11位 数字|字母|连字符 。
+		 *  示例值:jTpGmxUX3FBWVQ5NJTZvlKX_go0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
+		 * 
+ */ + @SerializedName(value = "id_doc_number") + private String idDocNumber; + + /** + *
+		 * 字段名:证件照片
+		 * 变量名:id_doc_copy
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
+		 *  2、2M内的彩色图片,格式可为bmp、png、jpeg、jpg或gif 。
+		 *  示例值:xi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
+		 * 
+ */ + @SerializedName(value = "id_doc_copy") + private String idDocCopy; + + /** + *
+		 * 字段名:证件结束日期
+		 * 变量名:doc_period_end
+		 * 是否必填:是
+		 * 类型:string(128)
+		 * 描述:
+		 *  1、请按照示例值填写。
+		 *  2、若证件有效期为长期,请填写:长期。
+		 *  3、证件有效期需大于60天 。
+		 *  示例值:2020-01-02
+		 * 
+ */ + @SerializedName(value = "doc_period_end") + private String docPeriodEnd; + + } + + @Data + @NoArgsConstructor + public static class AccountInfo implements Serializable { + /** + *
+		 * 字段名:账户类型
+		 * 变量名:bank_account_type
+		 * 是否必填:是
+		 * 类型:string(2)
+		 * 描述:
+		 *  1、若主体为企业/党政、机关及事业单位/其他组织,可填写:74-对公账户。
+		 *  2、若主体为小微,可填写:75-对私账户。
+		 *  3、若主体为个体工商户,可填写:74-对公账户或75-对私账户。
+		 *  示例值:75
+		 * 
+ */ + @SerializedName(value = "bank_account_type") + private String bankAccountType; + + /** + *
+		 * 字段名:开户银行
+		 * 变量名:account_bank
+		 * 是否必填:是
+		 * 类型:string(10)
+		 * 描述:
+		 *  详细参见开户银行对照表。
+		 *  示例值:工商银行
+		 * 
+ */ + @SerializedName(value = "account_bank") + private String accountBank; + + /** + *
+		 * 字段名:开户名称
+		 * 变量名:account_name
+		 * 是否必填:是
+		 * 类型:string(128)
+		 * 描述:
+		 *  1、选择经营者个人银行卡时,开户名称必须与身份证姓名一致。
+		 *  2、选择对公账户时,开户名称必须与营业执照上的“商户名称”一致。
+		 *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+		 *  示例值:AOZdYGISxo4yw96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==
+		 * 
+ */ + @SerializedName(value = "account_name") + @SpecEncrypt + private String accountName; + + /** + *
+		 * 字段名:开户银行省市编码
+		 * 变量名:bank_address_code
+		 * 是否必填:是
+		 * 类型:string(12)
+		 * 描述:
+		 *  至少精确到市,详细参见省市区编号对照表。
+		 *  示例值:110000
+		 * 
+ */ + @SerializedName(value = "bank_address_code") + private String bankAddressCode; + + /** + *
+		 * 字段名:开户银行联行号
+		 * 变量名:bank_branch_id
+		 * 是否必填:条件选填
+		 * 类型:string(64)
+		 * 描述:
+		 *  1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。
+		 *  2、详细参见开户银行全称(含支行)对照表。
+		 *  示例值:402713354941
+		 * 
+ */ + @SerializedName(value = "bank_branch_id") + private String bankBranchId; + + /** + *
+		 * 字段名:开户银行全称 (含支行)
+		 * 变量名:bank_name
+		 * 是否必填:条件选填
+		 * 类型:string(128)
+		 * 描述:
+		 *  1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。
+		 *  2、需填写银行全称,如"深圳农村商业银行XXX支行" 。
+		 *  3、详细参见开户银行全称(含支行)对照表。
+		 *  示例值:施秉县农村信用合作联社城关信用社
+		 * 
+ */ + @SerializedName(value = "bank_name") + private String bankName; + + /** + *
+		 * 字段名:银行帐号
+		 * 变量名:account_number
+		 * 是否必填:是
+		 * 类型:string(128)
+		 * 描述:
+		 *  1、数字,长度遵循系统支持的对公/对私卡号长度要求表。
+		 *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+		 *  示例值: d+xT+MQCvrLHUVDWv/8MR/dB7TkXLVfSrUxMPZy6jWWYzpRrEEaYQE8ZRGYoeorwC+w==
+		 * 
+ */ + @SerializedName(value = "account_number") + @SpecEncrypt + private String accountNumber; + + } + + @Data + @NoArgsConstructor + public static class ContactInfo implements Serializable { + /** + *
+		 * 字段名:超级管理员类型
+		 * 变量名:contact_type
+		 * 是否必填:是
+		 * 类型:string(2)
+		 * 描述:
+		 *  1、小微商户,选择:65-法人/经营者。
+		 *  2、个体工商户/企业/党政、机关及事业单位/其他组织,可选择:65-法人/经营者、66- 负责人。 (负责人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。
+		 *  示例值:65
+		 * 
+ */ + @SerializedName(value = "contact_type") + private String contactType; + + /** + *
+		 * 字段名:超级管理员姓名
+		 * 变量名:contact_name
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、若管理员类型为“法人”,则该姓名需与法人身份证姓名一致。
+		 *  2、若管理员类型为“经办人”,则可填写实际经办人的姓名。
+		 *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+		 *  (后续该管理员需使用实名微信号完成签约)
+		 *  示例值: pVd1HJ6zyvPedzGaV+X3IdGdbDnuC4Eelw/wDa4SzfeespQO/0kjiwfqdfg==
+		 * 
+ */ + @SerializedName(value = "contact_name") + @SpecEncrypt + private String contactName; + + /** + *
+		 * 字段名:超级管理员身份证件号码
+		 * 变量名:contact_id_card_number
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、若管理员类型为法人,则该身份证号码需与法人身份证号码一致。若管理员类型为经办人,则可填写实际经办人的身份证号码。
+		 *  2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。
+		 *  3、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。
+		 *  4、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+		 *  示例值:pVd1HJ6zmty7/mYNxLMpRSvMRtelw/wDa4SzfeespQO/0kjiwfqdfg==
+		 * 
+ */ + @SerializedName(value = "contact_id_card_number") + @SpecEncrypt + private String contactIdCardNumber; + + /** + *
+		 * 字段名:超级管理员手机
+		 * 变量名:mobile_phone
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、请填写管理员的手机号,11位数字, 用于接收微信支付的重要管理信息及日常操作验证码 。
+		 *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+		 *  示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiNWWNeespQO/0kjiwfqdfg==
+		 * 
+ */ + @SerializedName(value = "mobile_phone") + @SpecEncrypt + private String mobilePhone; + + /** + *
+		 * 字段名:超级管理员邮箱
+		 * 变量名:contact_email
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  1、用于接收微信支付的开户邮件及日常业务通知。
+		 *  2、需要带@,遵循邮箱格式校验 。
+		 *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+		 *  示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+FWWNUlw/wDa4SzfeespQO/0kjiwfqdfg==
+		 * 
+ */ + @SerializedName(value = "contact_email") + @SpecEncrypt + private String contactEmail; + + } + + @Data + @NoArgsConstructor + public static class SalesSceneInfo implements Serializable { + /** + *
+		 * 字段名:店铺名称
+		 * 变量名:store_name
+		 * 是否必填:是
+		 * 类型:string(256)
+		 * 描述:
+		 *  请填写店铺全称。
+		 *  示例值:爱烧烤
+		 * 
+ */ + @SerializedName(value = "store_name") + private String storeName; + + /** + *
+		 * 字段名:店铺链接
+		 * 变量名:store_url
+		 * 是否必填:二选一
+		 * 类型:string(1024)
+		 * 描述:
+		 *  1、店铺二维码or店铺链接二选一必填。
+		 *  2、请填写店铺主页链接,需符合网站规范。
+		 *  示例值:http://www.qq.com
+		 * 
+ */ + @SerializedName(value = "store_url") + private String storeUrl; + + /** + *
+		 * 字段名:店铺二维码
+		 * 变量名:store_qr_code
+		 * 是否必填:1、店铺二维码 or 店铺链接二选一必填。 2、若为电商小程序,可上传店铺页面的小程序二维码。 3、请填写通过图片上传接口预先上传图片生成好的MediaID,仅能上传1张图片 。 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO1D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
+		 * 类型:string(256)
+		 * 描述:
+		 * 
+ */ + @SerializedName(value = "store_qr_code") + private String storeQrCode; + + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java new file mode 100644 index 0000000000..dd2d46122c --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java @@ -0,0 +1,43 @@ +package com.github.binarywang.wxpay.bean.ecommerce; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 二级商户进件 提交申请结果响应 + */ +@Data +@NoArgsConstructor +public class ApplymentsResult implements Serializable { + + /** + *
+   * 字段名:微信支付申请单号
+   * 变量名:applyment_id
+   * 是否必填:是
+   * 类型:uint64
+   * 描述:
+   *  微信支付分配的申请单号 。
+   *  示例值:2000002124775691
+   * 
+ */ + @SerializedName(value = "applyment_id") + private String applymentId; + + /** + *
+   * 字段名:业务申请编号
+   * 变量名:out_request_no
+   * 是否必填:是
+   * 类型:string(124)
+   * 描述:
+   *  服务商自定义的商户唯一编号。每个编号对应一个申请单,每个申请单审核通过后会生成一个微信支付商户号。
+   *  示例值:APPLYMENT_00000000001
+   * 
+ */ + @SerializedName(value = "out_request_no") + private String outRequestNo; +} 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 new file mode 100644 index 0000000000..00967cfa67 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java @@ -0,0 +1,308 @@ +package com.github.binarywang.wxpay.bean.ecommerce; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +public class ApplymentsStatusResult implements Serializable { + /** + *
+   * 字段名:申请状态
+   * 变量名:applyment_state
+   * 是否必填:否
+   * 类型:string(32)
+   * 描述:
+   *  枚举值:
+   *  CHECKING:资料校验中
+   *  ACCOUNT_NEED_VERIFY:待账户验证
+   *  AUDITING:审核中
+   *  REJECTED:已驳回
+   *  NEED_SIGN:待签约
+   *  FINISH:完成
+   *  FROZEN:已冻结
+   *  示例值:FINISH
+   * 
+ */ + @SerializedName(value = "applyment_state") + private String applymentState; + + /** + *
+   * 字段名:申请状态描述
+   * 变量名:applyment_state_desc
+   * 是否必填:否
+   * 类型:string(32)
+   * 描述:
+   *  申请状态描述
+   *  示例值:“审核中”
+   * 
+ */ + @SerializedName(value = "applyment_state_desc") + private String applymentStateDesc; + + /** + *
+   * 字段名:签约链接
+   * 变量名:sign_url
+   * 是否必填:否
+   * 类型:string(256)
+   * 描述:
+   *  1、当申请状态为NEED_SIGN时才返回。
+   *  2、建议将链接转为二维码展示,需让申请单-管理者用微信扫码打开,完成签约。
+   *  示例值:https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec
+   * 
+ */ + @SerializedName(value = "sign_url") + private String signUrl; + + /** + *
+   * 字段名:电商平台二级商户号
+   * 变量名:sub_mchid
+   * 是否必填:否
+   * 类型:string(32)
+   * 描述:
+   *  当申请状态为NEED_SIGN或FINISH时才返回。
+   *  示例值:1542488631
+   * 
+ */ + @SerializedName(value = "sub_mchid") + private String subMchid; + + /** + *
+   * 字段名:+汇款账户验证信息
+   * 变量名:account_validation
+   * 是否必填:否
+   * 类型:object
+   * 描述:当申请状态为ACCOUNT_NEED_VERIFY 时有返回,可根据指引汇款,完成账户验证。
+   * 
+ */ + @SerializedName(value = "account_validation") + private AccountValidation accountValidation; + + /** + *
+   * 字段名:+驳回原因详情
+   * 变量名:audit_detail
+   * 是否必填:否
+   * 类型:array
+   * 描述:各项资料的审核情况。当申请状态为REJECTED或 FROZEN时才返回。
+   * 
+ */ + @SerializedName(value = "audit_detail") + private List auditDetail; + + /** + *
+   * 字段名:法人验证链接
+   * 变量名:legal_validation_url
+   * 是否必填:否
+   * 类型:string(256)
+   * 描述:
+   *  1、当申请状态为
+   *  ACCOUNT_NEED_VERIFY,且通过系统校验的申请单,将返回链接。
+   *  2、建议将链接转为二维码展示,让商户法人用微信扫码打开,完成账户验证。
+   *  示例值: https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec
+   * 
+ */ + @SerializedName(value = "legal_validation_url") + private String legalValidationUrl; + + /** + *
+   * 字段名:业务申请编号
+   * 变量名:out_request_no
+   * 是否必填:是
+   * 类型:string(124)
+   * 描述:
+   *  提交接口填写的业务申请编号。
+   *  示例值:APPLYMENT_00000000001
+   * 
+ */ + @SerializedName(value = "out_request_no") + private String outRequestNo; + + /** + *
+   * 字段名:微信支付申请单号
+   * 变量名:applyment_id
+   * 是否必填:否
+   * 类型:uint64
+   * 描述:
+   *  微信支付分配的申请单号。
+   *  示例值:2000002124775691
+   * 
+ */ + @SerializedName(value = "applyment_id") + private String applymentId; + + @Data + @NoArgsConstructor + public static class AccountValidation implements Serializable{ + /** + *
+     * 字段名:付款户名
+     * 变量名:account_name
+     * 是否必填:否
+     * 类型:uint64
+     * 描述:
+     *  需商户使用该户名的账户进行汇款。
+     *  示例值: rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==
+     * 
+ */ + @SerializedName(value = "account_name") + private String accountName; + + /** + *
+     * 字段名:付款卡号
+     * 变量名:account_no
+     * 是否必填:否
+     * 类型:string(128)
+     * 描述:
+     *  结算账户为对私时会返回,商户需使用该付款卡号进行汇款。
+     *  示例值:9nZYDEvBT4rDdICA3ZYXshYqeOSslSjSauAE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==
+     * 
+ */ + @SerializedName(value = "account_no") + private String accountNo; + + /** + *
+     * 字段名:汇款金额
+     * 变量名:pay_amount
+     * 是否必填:否
+     * 类型:string(32)
+     * 描述:
+     *  需要汇款的金额(单位:分)。
+     *  示例值:124
+     * 
+ */ + @SerializedName(value = "pay_amount") + private String payAmount; + + /** + *
+     * 字段名:收款卡号
+     * 变量名:destination_account_number
+     * 是否必填:否
+     * 类型:string(128)
+     * 描述:
+     *  收款账户的卡号
+     *  示例值:7222223333322332
+     * 
+ */ + @SerializedName(value = "destination_account_number") + private String destinationAccountNumber; + + /** + *
+     * 字段名:收款户名
+     * 变量名:destination_account_name
+     * 是否必填:否
+     * 类型:string(128)
+     * 描述:
+     *  收款账户名
+     *  示例值:财付通支付科技有限公司
+     * 
+ */ + @SerializedName(value = "destination_account_name") + private String destinationAccountName; + + /** + *
+     * 字段名:开户银行
+     * 变量名:destination_account_bank
+     * 是否必填:否
+     * 类型:string(128)
+     * 描述:
+     *  收款账户的开户银行名称。
+     *  示例值:招商银行威盛大厦支行
+     * 
+ */ + @SerializedName(value = "destination_account_bank") + private String destinationAccountBank; + + /** + *
+     * 字段名:省市信息
+     * 变量名:city
+     * 是否必填:否
+     * 类型:string(128)
+     * 描述:
+     *  收款账户的省市。
+     *  示例值:深圳
+     * 
+ */ + @SerializedName(value = "city") + private String city; + + /** + *
+     * 字段名:备注信息
+     * 变量名:remark
+     * 是否必填:否
+     * 类型:string(128)
+     * 描述:
+     *  商户汇款时,需要填写的备注信息。
+     *  示例值:入驻账户验证
+     * 
+ */ + @SerializedName(value = "remark") + private String remark; + + /** + *
+     * 字段名:汇款截止时间
+     * 变量名:deadline
+     * 是否必填:否
+     * 类型:string(20)
+     * 描述:
+     *  请在此时间前完成汇款。
+     *  示例值:2018-12-1017:09:01
+     * 
+ */ + @SerializedName(value = "deadline") + private String deadline; + + } + + @Data + @NoArgsConstructor + public static class AuditDetail implements Serializable{ + /** + *
+     * 字段名:参数名称
+     * 变量名:param_name
+     * 是否必填:否
+     * 类型:string(32)
+     * 描述:
+     *  提交申请单的资料项名称。
+     *  示例值:id_card_copy
+     * 
+ */ + @SerializedName(value = "param_name") + private String paramName; + + /** + *
+     * 字段名:驳回原因
+     * 变量名:reject_reason
+     * 是否必填:否
+     * 类型:string(32)
+     * 描述:
+     *  提交资料项被驳回原因。
+     *  示例值:身份证背面识别失败,请上传更清晰的身份证图片
+     * 
+ */ + @SerializedName(value = "reject_reason") + private String rejectReason; + + } +} 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 097a0fa0c7..2769e22018 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 @@ -130,6 +130,12 @@ public class WxPayConfig { * 私钥信息 */ private PrivateKey privateKey; + + /** + * 证书自动更新时间差(分钟),默认一分钟 + */ + private int certAutoUpdateTime = 60; + /** * p12证书文件内容的字节数组. */ @@ -245,8 +251,7 @@ public CloseableHttpClient initApiV3HttpClient() throws WxPayException { AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier( new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)), - apiV3Key.getBytes(StandardCharsets.UTF_8)); - + apiV3Key.getBytes(StandardCharsets.UTF_8), this.getCertAutoUpdateTime()); CloseableHttpClient httpClient = WxPayV3HttpClientBuilder.create() .withMerchant(mchId, certSerialNo, merchantPrivateKey) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java new file mode 100644 index 0000000000..f1bdb2b3eb --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java @@ -0,0 +1,55 @@ +package com.github.binarywang.wxpay.service; + +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsRequest; +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsResult; +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsStatusResult; +import com.github.binarywang.wxpay.exception.WxPayException; + +/** + *
+ *  电商收付通相关服务类.
+ *  接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
+ * 
+ * + * @author cloudX + * @date 2020/08/17 + */ +public interface EcommerceService { + /** + *
+   * 二级商户进件API
+   * 接口地址: https://api.mch.weixin.qq.com/v3/ecommerce/applyments/
+   * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_1.shtml
+   *
+   * 
+ * + * @param request 请求对象 + * @return . + */ + ApplymentsResult createApply(ApplymentsRequest request) throws WxPayException; + + /** + *
+   * 查询申请状态API
+   * 请求URL: https://api.mch.weixin.qq.com/v3/ecommerce/applyments/{applyment_id}
+   * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_2.shtml
+   * 
+ * + * @param applymentId 申请单ID + * @return . + */ + ApplymentsStatusResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException; + + /** + *
+   * 查询申请状态API
+   * 请求URL: https://api.mch.weixin.qq.com/v3/ecommerce/applyments/out-request-no/{out_request_no}
+   * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_2.shtml
+   * 
+ * + * @param outRequestNo 业务申请编号 + * @return . + */ + ApplymentsStatusResult queryApplyStatusByOutRequestNo(String outRequestNo) throws WxPayException; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index da7652ef69..2324fba170 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 @@ -126,6 +126,12 @@ public interface WxPayService { */ PayScoreService getPayScoreService(); + /** + * 获取电商收付通服务类 + * @return + */ + EcommerceService getEcommerceService(); + /** * 设置企业付款服务类,允许开发者自定义实现类. * 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 efe9e70e0a..3bd514a609 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 @@ -62,6 +62,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { private ProfitSharingService profitSharingService = new ProfitSharingServiceImpl(this); private RedpackService redpackService = new RedpackServiceImpl(this); private PayScoreService payScoreService = new PayScoreServiceImpl(this); + private EcommerceService ecommerceService = new EcommerceServiceImpl(this); /** * The Config. @@ -88,6 +89,11 @@ public RedpackService getRedpackService() { return this.redpackService; } + @Override + public EcommerceService getEcommerceService() { + return ecommerceService; + } + @Override public void setEntPayService(EntPayService entPayService) { this.entPayService = entPayService; diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java new file mode 100644 index 0000000000..0c7e3821ba --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java @@ -0,0 +1,52 @@ +package com.github.binarywang.wxpay.service.impl; + +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsRequest; +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsResult; +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsStatusResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.EcommerceService; +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 java.net.URI; + +public class EcommerceServiceImpl implements EcommerceService { + + private static final Gson GSON = new GsonBuilder().create(); + private WxPayService payService; + + /** + * + * @param payService + */ + public EcommerceServiceImpl(WxPayService payService) { + this.payService = payService; + } + + @Override + public ApplymentsResult createApply(ApplymentsRequest request) throws WxPayException { + String url = String.format("%s/v3/ecommerce/applyments/", this.payService.getPayBaseUrl()); + RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate()); + + String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request)); + return GSON.fromJson(result, ApplymentsResult.class); + } + + @Override + public ApplymentsStatusResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException { + String url = String.format("%s/v3/ecommerce/applyments/%s", this.payService.getPayBaseUrl(), applymentId); + String result = this.payService.getV3(URI.create(url)); + return GSON.fromJson(result, ApplymentsStatusResult.class); + } + + @Override + public ApplymentsStatusResult queryApplyStatusByOutRequestNo(String outRequestNo) throws WxPayException { + String url = String.format("%s/v3/ecommerce/applyments/out-request-no/%s", this.payService.getPayBaseUrl(), outRequestNo); + String result = this.payService.getV3(URI.create(url)); + return GSON.fromJson(result, ApplymentsStatusResult.class); + } + + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java index b6ab923168..d88c67e419 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/RsaCryptoUtil.java @@ -29,10 +29,8 @@ public class RsaCryptoUtil { public static void encryptFields(Object encryptObject, X509Certificate certificate) throws WxPayException { try { encryptField(encryptObject, certificate); - } catch (IllegalAccessException | IllegalBlockSizeException e) { + } catch (Exception e) { throw new WxPayException("敏感信息加密失败", e); - } catch (Exception e2) { - throw new WxPayException("敏感信息加密失败", e2); } } From 6f953862dfcb0c42b762713c8f195b40519da69b Mon Sep 17 00:00:00 2001 From: xyz9025 <499615297@qq.com> Date: Fri, 21 Aug 2020 22:30:17 +0800 Subject: [PATCH 80/90] =?UTF-8?q?:new:=20#1720=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=BE=A4=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E4=BA=BA=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #1720 增加群机器人的消息类型 * #1720 增加文件流生成base64方法,用于图片转base64,群机器人图片消息发送测试 * #1720 增加群机器人消息推送地址webhook/send * #1720 增加群机器人webhook_key配置属性 * #1720 增加群机器人消息推送接口服务、不需要自动带accessToken的post请求接口 * #1720 新增微信群机器人消息发送api * #1720 新增微信群机器人消息发送api单元测试 * #1720 新增微信群机器人消息发送api单元测试配置、新增属性webhook配置 Co-authored-by: yang ran --- .../chanjar/weixin/common/api/WxConsts.java | 25 ++++ .../weixin/common/util/fs/FileUtils.java | 29 +++++ .../weixin/cp/api/WxCpGroupRobotService.java | 52 ++++++++ .../me/chanjar/weixin/cp/api/WxCpService.java | 15 +++ .../cp/api/impl/BaseWxCpServiceImpl.java | 32 +++++ .../api/impl/WxCpGroupRobotServiceImpl.java | 65 ++++++++++ .../weixin/cp/bean/WxCpGroupRobotMessage.java | 118 ++++++++++++++++++ .../weixin/cp/config/WxCpConfigStorage.java | 8 ++ .../cp/config/impl/WxCpDefaultConfigImpl.java | 7 ++ .../cp/config/impl/WxCpRedisConfigImpl.java | 7 ++ .../weixin/cp/constant/WxCpApiPathConsts.java | 1 + .../cp/api/WxCpGroupRobotServiceTest.java | 66 ++++++++++ .../src/test/resources/test-config.sample.xml | 1 + weixin-java-cp/src/test/resources/testng.xml | 1 + 14 files changed, 427 insertions(+) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpGroupRobotService.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImpl.java create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpGroupRobotMessage.java create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpGroupRobotServiceTest.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 7f1dcdf023..2ba0f93213 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 @@ -105,6 +105,31 @@ public static class KefuMsgType { public static final String MINIPROGRAM_NOTICE = "miniprogram_notice"; } + /** + * 群机器人的消息类型. + */ + public static class GroupRobotMsgType { + /** + * 文本消息. + */ + public static final String TEXT = "text"; + + /** + * 图片消息. + */ + public static final String IMAGE = "image"; + + /** + * markdown消息. + */ + public static final String MARKDOWN = "markdown"; + + /** + * 图文消息(点击跳转到外链). + */ + public static final String NEWS = "news"; + } + /** * 表示是否是保密消息,0表示否,1表示是,默认0. */ diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java index 1b051a4718..a00c9cbade 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; +import java.util.Base64; public class FileUtils { @@ -34,4 +35,32 @@ public static File createTmpFile(InputStream inputStream, String name, String ex return createTmpFile(inputStream, name, ext, Files.createTempDirectory("weixin-java-tools-temp").toFile()); } + /** + * 文件流生成base64 + * + * @param in 文件流 + * @return base64编码 + */ + public static String imageToBase64ByStream(InputStream in) { + byte[] data = null; + // 读取图片字节数组 + try { + data = new byte[in.available()]; + in.read(data); + // 返回Base64编码过的字节数组字符串 + return Base64.getEncoder().encodeToString(data); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpGroupRobotService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpGroupRobotService.java new file mode 100644 index 0000000000..007dff78fc --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpGroupRobotService.java @@ -0,0 +1,52 @@ +package me.chanjar.weixin.cp.api; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.bean.article.NewArticle; + +import java.util.List; + +/** + * 微信群机器人消息发送api + * 文档地址:https://work.weixin.qq.com/help?doc_id=13376 + * 调用地址:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key= + * + * @author yr + * @date 2020-8-20 + */ +public interface WxCpGroupRobotService { + + /** + * 发送text类型的消息 + * + * @param content 文本内容,最长不超过2048个字节,必须是utf8编码 + * @param mentionedList userId的列表,提醒群中的指定成员(@某个成员),@all表示提醒所有人,如果开发者获取不到userId,可以使用mentioned_mobile_list + * @param mobileList 手机号列表,提醒手机号对应的群成员(@某个成员),@all表示提醒所有人 + * @throws WxErrorException 异常 + */ + void sendText(String content, List mentionedList, List mobileList) throws WxErrorException; + + /** + * 发送markdown类型的消息 + * + * @param content markdown内容,最长不超过4096个字节,必须是utf8编码 + * @throws WxErrorException 异常 + */ + void sendMarkDown(String content) throws WxErrorException; + + /** + * 发送image类型的消息 + * + * @param base64 图片内容的base64编码 + * @param md5 图片内容(base64编码前)的md5值 + * @throws WxErrorException 异常 + */ + void sendImage(String base64, String md5) throws WxErrorException; + + /** + * 发送news类型的消息 + * + * @param articleList 图文消息,支持1到8条图文 + * @throws WxErrorException 异常 + */ + void sendNews(List articleList) throws WxErrorException; +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index 73776228ed..036265815b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -173,6 +173,14 @@ public interface WxCpService { */ String post(String url, String postData) throws WxErrorException; + /** + * 当不需要自动带accessToken的时候,可以用这个发起post请求 + * + * @param url 接口地址 + * @param postData 请求body字符串 + */ + String postWithoutToken(String url, String postData) throws WxErrorException; + /** *
    * Service没有实现某个API的时候,可以用这个,
@@ -328,6 +336,13 @@ public interface WxCpService {
 
   WxCpOaService getOAService();
 
+  /**
+   * 获取群机器人消息推送服务
+   *
+   * @return 群机器人消息推送服务
+   */
+  WxCpGroupRobotService getGroupRobotService();
+
   /**
    * http请求对象
    */
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
index 75cf92aa9c..f2d96cf5cb 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
@@ -51,6 +51,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH
   private WxCpOaService oaService = new WxCpOaServiceImpl(this);
   private WxCpTaskCardService taskCardService = new WxCpTaskCardServiceImpl(this);
   private WxCpExternalContactService externalContactService = new WxCpExternalContactServiceImpl(this);
+  private WxCpGroupRobotService groupRobotService = new WxCpGroupRobotServiceImpl(this);
 
   /**
    * 全局的是否正在刷新access token的锁.
@@ -217,6 +218,11 @@ public String post(String url, String postData) throws WxErrorException {
     return execute(SimplePostRequestExecutor.create(this), url, postData);
   }
 
+  @Override
+  public String postWithoutToken(String url, String postData) throws WxErrorException {
+    return this.executeNormal(SimplePostRequestExecutor.create(this), url, postData);
+  }
+
   /**
    * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求.
    */
@@ -296,6 +302,27 @@ protected  T executeInternal(RequestExecutor executor, String uri, E
     }
   }
 
+  /**
+   * 普通请求,不自动带accessToken
+   */
+  private  T executeNormal(RequestExecutor executor, String uri, E data) throws WxErrorException {
+    try {
+      T result = executor.execute(uri, data, WxType.CP);
+      log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uri, data, result);
+      return result;
+    } catch (WxErrorException e) {
+      WxError error = e.getError();
+      if (error.getErrorCode() != 0) {
+        log.error("\n【请求地址】: {}\n【请求参数】:{}\n【错误信息】:{}", uri, data, error);
+        throw new WxErrorException(error, e);
+      }
+      return null;
+    } catch (IOException e) {
+      log.error("\n【请求地址】: {}\n【请求参数】:{}\n【异常信息】:{}", uri, data, e.getMessage());
+      throw new RuntimeException(e);
+    }
+  }
+
   @Override
   public void setWxCpConfigStorage(WxCpConfigStorage wxConfigProvider) {
     this.configStorage = wxConfigProvider;
@@ -412,6 +439,11 @@ public WxCpOaService getOAService() {
     return oaService;
   }
 
+  @Override
+  public WxCpGroupRobotService getGroupRobotService() {
+    return groupRobotService;
+  }
+
   @Override
   public WxCpTaskCardService getTaskCardService() {
     return taskCardService;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImpl.java
new file mode 100644
index 0000000000..ed4d8a108e
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImpl.java
@@ -0,0 +1,65 @@
+package me.chanjar.weixin.cp.api.impl;
+
+import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.cp.api.WxCpGroupRobotService;
+import me.chanjar.weixin.cp.api.WxCpService;
+import me.chanjar.weixin.cp.bean.WxCpGroupRobotMessage;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
+import me.chanjar.weixin.cp.config.WxCpConfigStorage;
+import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
+
+import java.util.List;
+
+/**
+ * 微信群机器人消息发送api 实现
+ *
+ * @author yr
+ * @date 2020-08-20
+ */
+@RequiredArgsConstructor
+public class WxCpGroupRobotServiceImpl implements WxCpGroupRobotService {
+  private final WxCpService cpService;
+
+  private String getApiUrl() {
+    WxCpConfigStorage wxCpConfigStorage = cpService.getWxCpConfigStorage();
+    return wxCpConfigStorage.getApiUrl(WxCpApiPathConsts.WEBHOOK_SEND) + wxCpConfigStorage.getWebhookKey();
+  }
+
+  @Override
+  public void sendText(String content, List mentionedList, List mobileList) throws WxErrorException {
+    WxCpGroupRobotMessage message = new WxCpGroupRobotMessage()
+      .setMsgType(WxConsts.GroupRobotMsgType.TEXT)
+      .setContent(content)
+      .setMentionedList(mentionedList)
+      .setMentionedMobileList(mobileList);
+    cpService.postWithoutToken(this.getApiUrl(), message.toJson());
+  }
+
+  @Override
+  public void sendMarkDown(String content) throws WxErrorException {
+    WxCpGroupRobotMessage message = new WxCpGroupRobotMessage()
+      .setMsgType(WxConsts.GroupRobotMsgType.MARKDOWN)
+      .setContent(content);
+    cpService.postWithoutToken(this.getApiUrl(), message.toJson());
+  }
+
+  @Override
+  public void sendImage(String base64, String md5) throws WxErrorException {
+    WxCpGroupRobotMessage message = new WxCpGroupRobotMessage()
+      .setMsgType(WxConsts.GroupRobotMsgType.IMAGE)
+      .setBase64(base64)
+      .setMd5(md5);
+    cpService.postWithoutToken(this.getApiUrl(), message.toJson());
+  }
+
+  @Override
+  public void sendNews(List articleList) throws WxErrorException {
+    WxCpGroupRobotMessage message = new WxCpGroupRobotMessage()
+      .setMsgType(WxConsts.GroupRobotMsgType.NEWS)
+      .setArticles(articleList);
+    cpService.postWithoutToken(this.getApiUrl(), message.toJson());
+  }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpGroupRobotMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpGroupRobotMessage.java
new file mode 100644
index 0000000000..937a88cb09
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpGroupRobotMessage.java
@@ -0,0 +1,118 @@
+package me.chanjar.weixin.cp.bean;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
+
+import java.util.List;
+
+import static me.chanjar.weixin.common.api.WxConsts.GroupRobotMsgType.*;
+
+/**
+ * 微信群机器人消息
+ *
+ * @author yr
+ * @date 2020-08-20
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = true)
+@Data
+public class WxCpGroupRobotMessage {
+  /**
+   * 消息类型
+   */
+  private String msgType;
+
+  /**
+   * 文本内容,最长不超过2048个字节,markdown内容,最长不超过4096个字节,必须是utf8编码
+   * 必填
+   */
+  private String content;
+  /**
+   * userid的列表,提醒群中的指定成员(@某个成员),@all表示提醒所有人,如果开发者获取不到userid,可以使用mentioned_mobile_list
+   */
+  private List mentionedList;
+  /**
+   * 手机号列表,提醒手机号对应的群成员(@某个成员),@all表示提醒所有人
+   */
+  private List mentionedMobileList;
+  /**
+   * 图片内容的base64编码
+   */
+  private String base64;
+  /**
+   * 图片内容(base64编码前)的md5值
+   */
+  private String md5;
+  /**
+   * 图文消息,一个图文消息支持1到8条图文
+   */
+  private List articles;
+
+  public String toJson() {
+    JsonObject messageJson = new JsonObject();
+    messageJson.addProperty("msgtype", this.getMsgType());
+
+    switch (this.getMsgType()) {
+      case TEXT: {
+        JsonObject text = new JsonObject();
+        JsonArray uidJsonArray = new JsonArray();
+        JsonArray mobileJsonArray = new JsonArray();
+
+        text.addProperty("content", this.getContent());
+
+        if (this.getMentionedList() != null) {
+          for (String item : this.getMentionedList()) {
+            uidJsonArray.add(item);
+          }
+        }
+        if (this.getMentionedMobileList() != null) {
+          for (String item : this.getMentionedMobileList()) {
+            mobileJsonArray.add(item);
+          }
+        }
+        text.add("mentioned_list", uidJsonArray);
+        text.add("mentioned_mobile_list", mobileJsonArray);
+        messageJson.add("text", text);
+        break;
+      }
+      case MARKDOWN: {
+        JsonObject text = new JsonObject();
+        text.addProperty("content", this.getContent());
+        messageJson.add("markdown", text);
+        break;
+      }
+      case IMAGE: {
+        JsonObject text = new JsonObject();
+        text.addProperty("base64", this.getBase64());
+        text.addProperty("md5", this.getMd5());
+        messageJson.add("image", text);
+        break;
+      }
+      case NEWS: {
+        JsonObject text = new JsonObject();
+        JsonArray array = new JsonArray();
+        for (NewArticle article : this.getArticles()) {
+          JsonObject articleJson = new JsonObject();
+          articleJson.addProperty("title", article.getTitle());
+          articleJson.addProperty("description", article.getDescription());
+          articleJson.addProperty("url", article.getUrl());
+          articleJson.addProperty("picurl", article.getPicUrl());
+          array.add(articleJson);
+        }
+        text.add("articles", array);
+        messageJson.add("news", text);
+        break;
+      }
+      default:
+
+    }
+
+    return messageJson.toString();
+  }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/WxCpConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/WxCpConfigStorage.java
index 19c04f4be1..e81870ebe2 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/WxCpConfigStorage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/WxCpConfigStorage.java
@@ -107,7 +107,15 @@ public interface WxCpConfigStorage {
 
   /**
    * 是否自动刷新token
+   *
    * @return .
    */
   boolean autoRefreshToken();
+
+  /**
+   * 获取群机器人webhook的key
+   *
+   * @return key
+   */
+  String getWebhookKey();
 }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpDefaultConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpDefaultConfigImpl.java
index bd407af6db..a9b449530a 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpDefaultConfigImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpDefaultConfigImpl.java
@@ -50,6 +50,8 @@ public class WxCpDefaultConfigImpl implements WxCpConfigStorage, Serializable {
 
   private volatile String baseApiUrl;
 
+  private volatile String webhookKey;
+
   @Override
   public void setBaseApiUrl(String baseUrl) {
     this.baseApiUrl = baseUrl;
@@ -287,6 +289,11 @@ public boolean autoRefreshToken() {
     return true;
   }
 
+  @Override
+  public String getWebhookKey() {
+    return this.webhookKey;
+  }
+
   public void setApacheHttpClientBuilder(ApacheHttpClientBuilder apacheHttpClientBuilder) {
     this.apacheHttpClientBuilder = apacheHttpClientBuilder;
   }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java
index 9133a6ce3e..a92af02d1e 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java
@@ -46,6 +46,8 @@ public class WxCpRedisConfigImpl implements WxCpConfigStorage {
 
   protected volatile String baseApiUrl;
 
+  private volatile String webhookKey;
+
   @Override
   public void setBaseApiUrl(String baseUrl) {
     this.baseApiUrl = baseUrl;
@@ -344,6 +346,11 @@ public boolean autoRefreshToken() {
     return true;
   }
 
+  @Override
+  public String getWebhookKey() {
+    return this.getWebhookKey();
+  }
+
   public void setApacheHttpClientBuilder(ApacheHttpClientBuilder apacheHttpClientBuilder) {
     this.apacheHttpClientBuilder = apacheHttpClientBuilder;
   }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
index 6b5e9444c4..eaaf937d08 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
@@ -21,6 +21,7 @@ public final class WxCpApiPathConsts {
   public static final String BATCH_GET_RESULT = "/cgi-bin/batch/getresult?jobid=";
   public static final String JSCODE_TO_SESSION = "/cgi-bin/miniprogram/jscode2session";
   public static final String GET_TOKEN = "/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
+  public static final String WEBHOOK_SEND = "/cgi-bin/webhook/send?key=";
 
   public static class Agent {
     public static final String AGENT_GET = "/cgi-bin/agent/get?agentid=%d";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpGroupRobotServiceTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpGroupRobotServiceTest.java
new file mode 100644
index 0000000000..126a215b78
--- /dev/null
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpGroupRobotServiceTest.java
@@ -0,0 +1,66 @@
+package me.chanjar.weixin.cp.api;
+
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.fs.FileUtils;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.io.InputStream;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.testng.Assert.*;
+
+/**
+ * 微信群机器人消息发送api 单元测试
+ *
+ * @author yr
+ * @date 2020-08-20
+ */
+@Slf4j
+@Guice(modules = ApiTestModule.class)
+public class WxCpGroupRobotServiceTest {
+
+  @Inject
+  protected WxCpService wxService;
+
+  private WxCpGroupRobotService robotService;
+
+  @BeforeTest
+  public void setup() {
+    robotService = wxService.getGroupRobotService();
+  }
+
+  @Test
+  public void testSendText() throws WxErrorException {
+    robotService.sendText("Hello World", null, null);
+  }
+
+  @Test
+  public void testSendMarkDown() throws WxErrorException {
+    String content = "实时新增用户反馈132例,请相关同事注意。\n" +
+      ">类型:用户反馈 \n" +
+      ">普通用户反馈:117例 \n" +
+      ">VIP用户反馈:15例";
+    robotService.sendMarkDown(content);
+  }
+
+  @Test
+  public void testSendImage() throws WxErrorException {
+    InputStream inputStream = getClass().getClassLoader().getResourceAsStream("mm.jpeg");
+    assert inputStream != null;
+    String base64 = FileUtils.imageToBase64ByStream(inputStream);
+    String md5 = "1cb2e787063d66e24f5f89e7fc267a4d";
+    robotService.sendImage(base64, md5);
+  }
+
+  @Test
+  public void testSendNews() throws WxErrorException {
+    NewArticle article = new NewArticle("图文消息测试","hello world","http://www.baidu.com","http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png");
+    robotService.sendNews(Stream.of(article).collect(Collectors.toList()));
+  }
+}
diff --git a/weixin-java-cp/src/test/resources/test-config.sample.xml b/weixin-java-cp/src/test/resources/test-config.sample.xml
index 6f98ebafc1..76a74a25a3 100644
--- a/weixin-java-cp/src/test/resources/test-config.sample.xml
+++ b/weixin-java-cp/src/test/resources/test-config.sample.xml
@@ -10,4 +10,5 @@
   企业号通讯录的某个部门id
   企业号通讯录里的某个tagid
   网页授权获取用户信息回调地址
+  webhook链接地址的key值
 
diff --git a/weixin-java-cp/src/test/resources/testng.xml b/weixin-java-cp/src/test/resources/testng.xml
index ffa8a2edff..4b94015661 100644
--- a/weixin-java-cp/src/test/resources/testng.xml
+++ b/weixin-java-cp/src/test/resources/testng.xml
@@ -7,6 +7,7 @@
       
       
       
+      
     
   
 

From c1c66e940e54ca63fc7358897522eb9eee619aae Mon Sep 17 00:00:00 2001
From: Missionary <37208622+missionOdd@users.noreply.github.com>
Date: Sat, 22 Aug 2020 16:56:57 +0800
Subject: [PATCH 81/90] =?UTF-8?q?:bug:=20#1724=20=E5=BE=AE=E4=BF=A1?=
 =?UTF-8?q?=E6=94=AF=E4=BB=98=E8=AF=81=E4=B9=A6=E5=88=9D=E5=A7=8B=E5=8C=96?=
 =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=8E=BB=E6=8E=89=E4=B8=8D=E6=8E=A8=E8=8D=90?=
 =?UTF-8?q?=E7=9A=84TLSv1=E5=8D=8F=E8=AE=AE=EF=BC=8C=E8=A7=A3=E5=86=B3?=
 =?UTF-8?q?=E9=80=80=E6=AC=BE=E6=8E=A5=E5=8F=A3=E6=8A=A5No=20appropriate?=
 =?UTF-8?q?=20protocol=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wxpay/service/impl/WxPayServiceApacheHttpImpl.java         | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
index 7923c4723e..aadb051410 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
@@ -27,7 +27,6 @@
 import org.apache.http.util.EntityUtils;
 
 import javax.net.ssl.SSLContext;
-import java.math.BigInteger;
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
 
@@ -262,7 +261,7 @@ private void initSSLContext(HttpClientBuilder httpClientBuilder) throws WxPayExc
     }
 
     SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
-      new String[]{"TLSv1"}, null, new DefaultHostnameVerifier());
+        new DefaultHostnameVerifier());
     httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
   }
 

From bd100bf846e7490cb2fef2cf8ad69d961624f347 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 22 Aug 2020 17:13:09 +0800
Subject: [PATCH 82/90] =?UTF-8?q?:bug:=20#1714=20=E4=BF=AE=E5=A4=8D?=
 =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6?=
 =?UTF-8?q?=E6=8A=A5=E9=94=99=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/BaseWxMaServiceImpl.java           | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

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 fc04b5b6f4..2b1cb6669a 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
@@ -298,7 +298,12 @@ protected String extractAccessToken(String resultContent) throws WxErrorExceptio
 
   @Override
   public WxMaConfig getWxMaConfig() {
-    return this.wxMaConfig;
+    if (this.configMap.size() == 1) {
+      // 只有一个小程序,直接返回其配置即可
+      return this.configMap.values().iterator().next();
+    }
+
+    return this.configMap.get(WxMaConfigHolder.get());
   }
 
   @Override

From aca8dbabbcf51da7a7af0b7235ad23060571082c Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 22 Aug 2020 17:13:35 +0800
Subject: [PATCH 83/90] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E8=A7=84?=
 =?UTF-8?q?=E8=8C=83=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-java-miniapp/pom.xml                   |    1 -
 .../applyment/ApplymentStateQueryResult.java  |  114 +-
 .../applyment/ModifySettlementRequest.java    |    5 +-
 .../bean/applyment/SettlementInfoResult.java  |    8 +-
 .../bean/ecommerce/ApplymentsRequest.java     | 1507 +++++++++--------
 .../bean/ecommerce/ApplymentsResult.java      |    2 +-
 .../ecommerce/ApplymentsStatusResult.java     |    6 +-
 .../wxpay/service/Applyment4SubService.java   |   44 +-
 .../wxpay/service/EcommerceService.java       |    9 +-
 .../service/impl/EcommerceServiceImpl.java    |   13 +-
 .../impl/WxPayServiceApacheHttpImpl.java      |    8 +-
 11 files changed, 863 insertions(+), 854 deletions(-)

diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index bbcd43e8db..105d0594d6 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -87,7 +87,6 @@
     
       com.github.jedis-lock
       jedis-lock
-      1.0.0
       true
     
     
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java
index 41954a2aa9..24019fb914 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java
@@ -8,6 +8,7 @@
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -18,70 +19,69 @@
 @NoArgsConstructor
 @AllArgsConstructor
 @Accessors(chain = true)
-public class ApplymentStateQueryResult {
+public class ApplymentStateQueryResult implements Serializable {
+  private static final long serialVersionUID = 6539090917423486409L;
+  /**
+   * 业务申请编号
+   */
+  @SerializedName("business_code")
+  private String businessCode;
+  /**
+   * 微信支付申请单号
+   */
+  @SerializedName("applyment_id")
+  private String applymentId;
+  /**
+   * 特约商户号
+   */
+  @SerializedName("sub_mchid")
+  private String subMchid;
+  /**
+   * 超级管理员签约链接
+   */
+  @SerializedName("sign_url")
+  private String signUrl;
 
-    /**
-     * 业务申请编号
-     */
-    @SerializedName("business_code")
-    private String businessCode;
-    /**
-     * 微信支付申请单号
-     */
-    @SerializedName("applyment_id")
-    private String applymentId;
-    /**
-     * 特约商户号
-     */
-    @SerializedName("sub_mchid")
-    private String subMchid;
-    /**
-     * 超级管理员签约链接
-     */
-    @SerializedName("sign_url")
-    private String signUrl;
+  /**
+   * 申请单状态
+   */
+  @SerializedName("applyment_state")
+  private ApplymentStateEnum applymentState;
+  /**
+   * 申请状态描述
+   */
+  @SerializedName("applyment_state_msg")
+  private String applymentStateMsg;
+  /**
+   * 驳回原因详情
+   */
+  @SerializedName("audit_detail")
+  private List auditDetail;
 
+  /**
+   * 驳回原因详情
+   */
+  @Data
+  @Builder
+  @NoArgsConstructor
+  @AllArgsConstructor
+  @Accessors(chain = true)
+  public static class AuditDetail {
     /**
-     * 申请单状态
-     *
+     * 字段名
      */
-    @SerializedName("applyment_state")
-    private ApplymentStateEnum applymentState;
+    @SerializedName("field")
+    private String field;
     /**
-     * 申请状态描述
+     * 字段名称
      */
-    @SerializedName("applyment_state_msg")
-    private String applymentStateMsg;
-    /**
-     * 驳回原因详情
-     */
-    @SerializedName("audit_detail")
-    private List auditDetail;
-
+    @SerializedName("field_name")
+    private String fieldName;
     /**
-     * 驳回原因详情
+     * 驳回原因
      */
-    @Data
-    @Builder
-    @NoArgsConstructor
-    @AllArgsConstructor
-    @Accessors(chain = true)
-    public static class AuditDetail {
-        /**
-         * 字段名
-         */
-        @SerializedName("field")
-        private String field;
-        /**
-         * 字段名称
-         */
-        @SerializedName("field_name")
-        private String fieldName;
-        /**
-         * 驳回原因
-         */
-        @SerializedName("reject_reason")
-        private String rejectReason;
+    @SerializedName("reject_reason")
+    private String rejectReason;
 
-    }
+  }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java
index e31af2aed7..3ec162b0a5 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java
@@ -9,6 +9,8 @@
 import lombok.experimental.Accessors;
 import com.github.binarywang.wxpay.v3.SpecEncrypt;
 
+import java.io.Serializable;
+
 /**
  * 修改结算账户请求对象
  */
@@ -17,7 +19,8 @@
 @NoArgsConstructor
 @AllArgsConstructor
 @Accessors(chain = true)
-public class ModifySettlementRequest {
+public class ModifySettlementRequest implements Serializable {
+  private static final long serialVersionUID = 4568552340365230872L;
     /**
      *账户类型
      */
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java
index b284f7926a..0e35d2433c 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java
@@ -7,6 +7,8 @@
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+
 /**
  * 查询结算账户返回对象信息
  */
@@ -15,9 +17,9 @@
 @NoArgsConstructor
 @AllArgsConstructor
 @Accessors(chain = true)
-public class SettlementInfoResult {
-
-    /**
+public class SettlementInfoResult implements Serializable {
+  private static final long serialVersionUID = 4568552340365230872L;
+  /**
      * 账户类型
      */
     @SerializedName("account_type")
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java
index 92e069f631..bd021fc571 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java
@@ -17,780 +17,781 @@
 @Data
 @NoArgsConstructor
 public class ApplymentsRequest implements Serializable {
-	/**
-	 * 
-	 * 字段名:业务申请编号
-	 * 变量名:out_request_no
-	 * 是否必填:是
-	 * 类型:string(124)
-	 * 描述:
-	 *  1、服务商自定义的商户唯一编号。
-	 *  2、每个编号对应一个申请单,每个申请单审核通过后会生成一个微信支付商户号。
-	 *  3、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息 。
-	 *  示例值:APPLYMENT_00000000001
-	 * 
- */ - @SerializedName(value = "out_request_no") - private String outRequestNo; - - /** - *
-	 * 字段名:主体类型
-	 * 变量名:organization_type
-	 * 是否必填:是
-	 * 类型:string(4)
-	 * 描述:
-	 *  枚举值:
-	 *  2401:小微商户,指无营业执照的商户。
-	 *  4:个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。
-	 *  2:企业,营业执照上的主体类型一般为有限公司、有限责任公司。
-	 *  3:党政、机关及事业单位,包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构)。
-	 *  1708:其他组织,不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。
-	 *  示例值:2401
-	 * 
- */ - @SerializedName(value = "organization_type") - private String organizationType; - - /** - *
-	 * 字段名:+营业执照/登记证书信息
-	 * 变量名:business_license_info
-	 * 是否必填:条件选填
-	 * 类型:object
-	 * 描述:
-	 *  1、主体为“小微”时,不填。
-	 *  2、主体为“个体工商户/企业”时,请上传营业执照。
-	 *  3、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书。
-	 * 
- */ - @SerializedName(value = "business_license_info") - private BusinessLicenseInfo businessLicenseInfo; - - /** - *
-	 * 字段名:+组织机构代码证信息
-	 * 变量名:organization_cert_info
-	 * 是否必填:条件选填
-	 * 类型:object
-	 * 描述:主体为企业/党政、机关及事业单位/其他组织,且证件号码不是18位时必填。
-	 * 
- */ - @SerializedName(value = "organization_cert_info") - private OrganizationCertInfo organizationCertInfo; - - /** - *
-	 * 字段名:经营者/法人证件类型
-	 * 变量名:id_doc_type
-	 * 是否必填:否
-	 * 类型:string(64)
-	 * 描述:
-	 *  1、主体为“小微”,只可选择:身份证。
-	 *  2、主体为“个体户/企业/党政、机关及事业单位/其他组织”,可选择:任一证件类型。
-	 *  3、若没有填写,系统默认选择:身份证。
-	 *  枚举值:
-	 *  IDENTIFICATION_TYPE_MAINLAND_IDCARD:中国大陆居民-身份证
-	 *  IDENTIFICATION_TYPE_OVERSEA_PASSPORT:其他国家或地区居民-护照
-	 *  IDENTIFICATION_TYPE_HONGKONG:中国香港居民–来往内地通行证
-	 *  IDENTIFICATION_TYPE_MACAO:中国澳门居民–来往内地通行证
-	 *  IDENTIFICATION_TYPE_TAIWAN:中国台湾居民–来往大陆通行证
-	 *  示例值:IDENTIFICATION_TYPE_MACAO
-	 * 
- */ - @SerializedName(value = "id_doc_type") - private String idDocType; - - /** - *
-	 * 字段名:+经营者/法人身份证信息
-	 * 变量名:id_card_info
-	 * 是否必填:条件选填
-	 * 类型:object
-	 * 描述:
-	 *  请填写经营者/法人的身份证信息
-	 *  证件类型为“身份证”时填写。
-	 *
-	 * 
- */ - @SerializedName(value = "id_card_info") + private static final long serialVersionUID = -3092662029966103592L; + /** + *
+   * 字段名:业务申请编号
+   * 变量名:out_request_no
+   * 是否必填:是
+   * 类型:string(124)
+   * 描述:
+   *  1、服务商自定义的商户唯一编号。
+   *  2、每个编号对应一个申请单,每个申请单审核通过后会生成一个微信支付商户号。
+   *  3、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息 。
+   *  示例值:APPLYMENT_00000000001
+   * 
+ */ + @SerializedName(value = "out_request_no") + private String outRequestNo; + + /** + *
+   * 字段名:主体类型
+   * 变量名:organization_type
+   * 是否必填:是
+   * 类型:string(4)
+   * 描述:
+   *  枚举值:
+   *  2401:小微商户,指无营业执照的商户。
+   *  4:个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。
+   *  2:企业,营业执照上的主体类型一般为有限公司、有限责任公司。
+   *  3:党政、机关及事业单位,包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构)。
+   *  1708:其他组织,不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。
+   *  示例值:2401
+   * 
+ */ + @SerializedName(value = "organization_type") + private String organizationType; + + /** + *
+   * 字段名:+营业执照/登记证书信息
+   * 变量名:business_license_info
+   * 是否必填:条件选填
+   * 类型:object
+   * 描述:
+   *  1、主体为“小微”时,不填。
+   *  2、主体为“个体工商户/企业”时,请上传营业执照。
+   *  3、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书。
+   * 
+ */ + @SerializedName(value = "business_license_info") + private BusinessLicenseInfo businessLicenseInfo; + + /** + *
+   * 字段名:+组织机构代码证信息
+   * 变量名:organization_cert_info
+   * 是否必填:条件选填
+   * 类型:object
+   * 描述:主体为企业/党政、机关及事业单位/其他组织,且证件号码不是18位时必填。
+   * 
+ */ + @SerializedName(value = "organization_cert_info") + private OrganizationCertInfo organizationCertInfo; + + /** + *
+   * 字段名:经营者/法人证件类型
+   * 变量名:id_doc_type
+   * 是否必填:否
+   * 类型:string(64)
+   * 描述:
+   *  1、主体为“小微”,只可选择:身份证。
+   *  2、主体为“个体户/企业/党政、机关及事业单位/其他组织”,可选择:任一证件类型。
+   *  3、若没有填写,系统默认选择:身份证。
+   *  枚举值:
+   *  IDENTIFICATION_TYPE_MAINLAND_IDCARD:中国大陆居民-身份证
+   *  IDENTIFICATION_TYPE_OVERSEA_PASSPORT:其他国家或地区居民-护照
+   *  IDENTIFICATION_TYPE_HONGKONG:中国香港居民–来往内地通行证
+   *  IDENTIFICATION_TYPE_MACAO:中国澳门居民–来往内地通行证
+   *  IDENTIFICATION_TYPE_TAIWAN:中国台湾居民–来往大陆通行证
+   *  示例值:IDENTIFICATION_TYPE_MACAO
+   * 
+ */ + @SerializedName(value = "id_doc_type") + private String idDocType; + + /** + *
+   * 字段名:+经营者/法人身份证信息
+   * 变量名:id_card_info
+   * 是否必填:条件选填
+   * 类型:object
+   * 描述:
+   *  请填写经营者/法人的身份证信息
+   *  证件类型为“身份证”时填写。
+   *
+   * 
+ */ + @SerializedName(value = "id_card_info") @SpecEncrypt - private IdCardInfo idCardInfo; - - /** - *
-	 * 字段名:+经营者/法人其他类型证件信息
-	 * 变量名:id_doc_info
-	 * 是否必填:条件选填
-	 * 类型:object
-	 * 描述:证件类型为“来往内地通行证、来往大陆通行证、护照”时填写。
-	 * 
- */ - @SerializedName(value = "id_doc_info") - private IdDocInfo idDocInfo; - - /** - *
-	 * 字段名:是否填写结算账户信息
-	 * 变量名:need_account_info
-	 * 是否必填:是
-	 * 类型:bool
-	 * 描述:
-	 *  可根据实际情况,填写“true”或“false”。
-	 *  1、若为“true”,则需填写结算账户信息。
-	 *  2、若为“false”,则无需填写结算账户信息。
-	 *  示例值:true
-	 * 
- */ - @SerializedName(value = "need_account_info") - private Boolean needAccountInfo; - - /** - *
-	 * 字段名:+结算账户信息
-	 * 变量名:account_info
-	 * 是否必填:条件选填
-	 * 类型:object
-	 * 描述:若"是否填写结算账户信息"填写为“true”, 则必填,填写为“false”不填 。
-	 * 
- */ - @SerializedName(value = "account_info") + private IdCardInfo idCardInfo; + + /** + *
+   * 字段名:+经营者/法人其他类型证件信息
+   * 变量名:id_doc_info
+   * 是否必填:条件选填
+   * 类型:object
+   * 描述:证件类型为“来往内地通行证、来往大陆通行证、护照”时填写。
+   * 
+ */ + @SerializedName(value = "id_doc_info") + private IdDocInfo idDocInfo; + + /** + *
+   * 字段名:是否填写结算账户信息
+   * 变量名:need_account_info
+   * 是否必填:是
+   * 类型:bool
+   * 描述:
+   *  可根据实际情况,填写“true”或“false”。
+   *  1、若为“true”,则需填写结算账户信息。
+   *  2、若为“false”,则无需填写结算账户信息。
+   *  示例值:true
+   * 
+ */ + @SerializedName(value = "need_account_info") + private Boolean needAccountInfo; + + /** + *
+   * 字段名:+结算账户信息
+   * 变量名:account_info
+   * 是否必填:条件选填
+   * 类型:object
+   * 描述:若"是否填写结算账户信息"填写为“true”, 则必填,填写为“false”不填 。
+   * 
+ */ + @SerializedName(value = "account_info") @SpecEncrypt - private AccountInfo accountInfo; - - /** - *
-	 * 字段名:+超级管理员信息
-	 * 变量名:contact_info
-	 * 是否必填:是
-	 * 类型:object
-	 * 描述:
-	 *  请填写店铺的超级管理员信息。
-	 *  超级管理员需在开户后进行签约,并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。
-	 * 
- */ - @SerializedName(value = "contact_info") + private AccountInfo accountInfo; + + /** + *
+   * 字段名:+超级管理员信息
+   * 变量名:contact_info
+   * 是否必填:是
+   * 类型:object
+   * 描述:
+   *  请填写店铺的超级管理员信息。
+   *  超级管理员需在开户后进行签约,并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。
+   * 
+ */ + @SerializedName(value = "contact_info") @SpecEncrypt - private ContactInfo contactInfo; - - /** - *
-	 * 字段名:+店铺信息
-	 * 变量名:sales_scene_info
-	 * 是否必填:是
-	 * 类型:object
-	 * 描述:请填写店铺信息
-	 * 
- */ - @SerializedName(value = "sales_scene_info") - private SalesSceneInfo salesSceneInfo; - - /** - *
-	 * 字段名:商户简称
-	 * 变量名:merchant_shortname
-	 * 是否必填:是
-	 * 类型:string(64)
-	 * 描述:
-	 *  UTF-8格式,中文占3个字节,即最多16个汉字长度。将在支付完成页向买家展示,需与商家的实际售卖商品相符 。
-	 *  示例值:腾讯
-	 * 
- */ - @SerializedName(value = "merchant_shortname") - private String merchantShortname; - - /** - *
-	 * 字段名:特殊资质
-	 * 变量名:qualifications
-	 * 是否必填:否
-	 * 类型:string(1024)
-	 * 描述:
-	 *  1、若店铺业务包含互联网售药,则需上传特殊资质-《互联网药品交易服务证》。
-	 *  2、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
-	 *  示例值:[\"jTpGmxUX3FBWVQ5NJInE4d2I6_H7I4\"]
-	 * 
- */ - @SerializedName(value = "qualifications") - private String qualifications; - - /** - *
-	 * 字段名:补充材料
-	 * 变量名:business_addition_pics
-	 * 是否必填:否
-	 * 类型:string(1024)
-	 * 描述:
-	 *   最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
-	 *  示例值:[\"jTpGmg05InE4d2I6_H7I4\"]
-	 * 
- */ - @SerializedName(value = "business_addition_pics") - private String businessAdditionPics; - - /** - *
-	 * 字段名:补充说明
-	 * 变量名:business_addition_desc
-	 * 是否必填:否
-	 * 类型:string(256)
-	 * 描述:
-	 *   可填写512字以内 。
-	 *  示例值:特殊情况,说明原因
-	 * 
- */ - @SerializedName(value = "business_addition_desc") - private String businessAdditionDesc; - - @Data + private ContactInfo contactInfo; + + /** + *
+   * 字段名:+店铺信息
+   * 变量名:sales_scene_info
+   * 是否必填:是
+   * 类型:object
+   * 描述:请填写店铺信息
+   * 
+ */ + @SerializedName(value = "sales_scene_info") + private SalesSceneInfo salesSceneInfo; + + /** + *
+   * 字段名:商户简称
+   * 变量名:merchant_shortname
+   * 是否必填:是
+   * 类型:string(64)
+   * 描述:
+   *  UTF-8格式,中文占3个字节,即最多16个汉字长度。将在支付完成页向买家展示,需与商家的实际售卖商品相符 。
+   *  示例值:腾讯
+   * 
+ */ + @SerializedName(value = "merchant_shortname") + private String merchantShortname; + + /** + *
+   * 字段名:特殊资质
+   * 变量名:qualifications
+   * 是否必填:否
+   * 类型:string(1024)
+   * 描述:
+   *  1、若店铺业务包含互联网售药,则需上传特殊资质-《互联网药品交易服务证》。
+   *  2、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+   *  示例值:[\"jTpGmxUX3FBWVQ5NJInE4d2I6_H7I4\"]
+   * 
+ */ + @SerializedName(value = "qualifications") + private String qualifications; + + /** + *
+   * 字段名:补充材料
+   * 变量名:business_addition_pics
+   * 是否必填:否
+   * 类型:string(1024)
+   * 描述:
+   *   最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+   *  示例值:[\"jTpGmg05InE4d2I6_H7I4\"]
+   * 
+ */ + @SerializedName(value = "business_addition_pics") + private String businessAdditionPics; + + /** + *
+   * 字段名:补充说明
+   * 变量名:business_addition_desc
+   * 是否必填:否
+   * 类型:string(256)
+   * 描述:
+   *   可填写512字以内 。
+   *  示例值:特殊情况,说明原因
+   * 
+ */ + @SerializedName(value = "business_addition_desc") + private String businessAdditionDesc; + + @Data @NoArgsConstructor - public static class BusinessLicenseInfo implements Serializable{ - /** - *
-		 * 字段名:证件扫描件
-		 * 变量名:business_license_copy
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、主体为“个体工商户/企业”时,请上传营业执照的证件图片。
-		 *  2、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书的证件图片。
-		 *  3、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
-		 *  4、图片要求:
-		 *  (1)请上传证件的彩色扫描件或彩色数码拍摄件,黑白复印件需加盖公章(公章信息需完整) 。
-		 *  (2)不得添加无关水印(非微信支付商户申请用途的其他水印)。
-		 *  (3)需提供证件的正面拍摄件,完整、照面信息清晰可见。信息不清晰、扭曲、压缩变形、反光、不完整均不接受。
-		 *  (4)不接受二次剪裁、翻拍、PS的证件照片。
-		 *  示例值: 47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
-		 * 
- */ - @SerializedName(value = "business_license_copy") - private String businessLicenseCopy; - - /** - *
-		 * 字段名:证件注册号
-		 * 变量名:business_license_number
-		 * 是否必填:是
-		 * 类型:string(18)
-		 * 描述:
-		 *  1、主体为“个体工商户/企业”时,请填写营业执照上的注册号/统一社会信用代码,须为15位数字或 18位数字|大写字母。
-		 *  2、主体为“党政、机关及事业单位/其他组织”时,请填写登记证书的证书编号。
-		 *  示例值:123456789012345678
-		 *  特殊规则:长度最小15个字节
-		 * 
- */ - @SerializedName(value = "business_license_number") - private String businessLicenseNumber; - - /** - *
-		 * 字段名:商户名称
-		 * 变量名:merchant_name
-		 * 是否必填:是
-		 * 类型:string(128)
-		 * 描述:
-		 *  1、请填写营业执照/登记证书的商家名称,2~110个字符,支持括号 。
-		 *  2、个体工商户/党政、机关及事业单位,不能以“公司”结尾。
-		 *  3、个体工商户,若营业执照上商户名称为空或为“无”,请填写"个体户+经营者姓名",如“个体户张三” 。
-		 *  示例值:腾讯科技有限公司
-		 * 
- */ - @SerializedName(value = "merchant_name") - private String merchantName; - - /** - *
-		 * 字段名:经营者/法定代表人姓名
-		 * 变量名:legal_person
-		 * 是否必填:是
-		 * 类型:string(128)
-		 * 描述:
-		 *  请填写证件的经营者/法定代表人姓名
-		 *  示例值:张三
-		 * 
- */ - @SerializedName(value = "legal_person") - private String legalPerson; - - /** - *
-		 * 字段名:注册地址
-		 * 变量名:company_address
-		 * 是否必填:条件选填
-		 * 类型:string(128)
-		 * 描述:
-		 *  主体为“党政、机关及事业单位/其他组织”时必填,请填写登记证书的注册地址。
-		 *  示例值:深圳南山区科苑路
-		 * 
- */ - @SerializedName(value = "company_address") - private String companyAddress; - - /** - *
-		 * 字段名:营业期限
-		 * 变量名:business_time
-		 * 是否必填:条件选填
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、主体为“党政、机关及事业单位/其他组织”时必填,请填写证件有效期。
-		 *  2、若证件有效期为长期,请填写:长期。
-		 *  3、结束时间需大于开始时间。
-		 *  4、有效期必须大于60天,即结束时间距当前时间需超过60天。
-		 *  示例值:[\"2014-01-01\",\"长期\"]
-		 * 
- */ - @SerializedName(value = "business_time") - private String businessTime; - - } - - @Data + public static class BusinessLicenseInfo implements Serializable { + /** + *
+     * 字段名:证件扫描件
+     * 变量名:business_license_copy
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、主体为“个体工商户/企业”时,请上传营业执照的证件图片。
+     *  2、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书的证件图片。
+     *  3、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+     *  4、图片要求:
+     *  (1)请上传证件的彩色扫描件或彩色数码拍摄件,黑白复印件需加盖公章(公章信息需完整) 。
+     *  (2)不得添加无关水印(非微信支付商户申请用途的其他水印)。
+     *  (3)需提供证件的正面拍摄件,完整、照面信息清晰可见。信息不清晰、扭曲、压缩变形、反光、不完整均不接受。
+     *  (4)不接受二次剪裁、翻拍、PS的证件照片。
+     *  示例值: 47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
+     * 
+ */ + @SerializedName(value = "business_license_copy") + private String businessLicenseCopy; + + /** + *
+     * 字段名:证件注册号
+     * 变量名:business_license_number
+     * 是否必填:是
+     * 类型:string(18)
+     * 描述:
+     *  1、主体为“个体工商户/企业”时,请填写营业执照上的注册号/统一社会信用代码,须为15位数字或 18位数字|大写字母。
+     *  2、主体为“党政、机关及事业单位/其他组织”时,请填写登记证书的证书编号。
+     *  示例值:123456789012345678
+     *  特殊规则:长度最小15个字节
+     * 
+ */ + @SerializedName(value = "business_license_number") + private String businessLicenseNumber; + + /** + *
+     * 字段名:商户名称
+     * 变量名:merchant_name
+     * 是否必填:是
+     * 类型:string(128)
+     * 描述:
+     *  1、请填写营业执照/登记证书的商家名称,2~110个字符,支持括号 。
+     *  2、个体工商户/党政、机关及事业单位,不能以“公司”结尾。
+     *  3、个体工商户,若营业执照上商户名称为空或为“无”,请填写"个体户+经营者姓名",如“个体户张三” 。
+     *  示例值:腾讯科技有限公司
+     * 
+ */ + @SerializedName(value = "merchant_name") + private String merchantName; + + /** + *
+     * 字段名:经营者/法定代表人姓名
+     * 变量名:legal_person
+     * 是否必填:是
+     * 类型:string(128)
+     * 描述:
+     *  请填写证件的经营者/法定代表人姓名
+     *  示例值:张三
+     * 
+ */ + @SerializedName(value = "legal_person") + private String legalPerson; + + /** + *
+     * 字段名:注册地址
+     * 变量名:company_address
+     * 是否必填:条件选填
+     * 类型:string(128)
+     * 描述:
+     *  主体为“党政、机关及事业单位/其他组织”时必填,请填写登记证书的注册地址。
+     *  示例值:深圳南山区科苑路
+     * 
+ */ + @SerializedName(value = "company_address") + private String companyAddress; + + /** + *
+     * 字段名:营业期限
+     * 变量名:business_time
+     * 是否必填:条件选填
+     * 类型:string(256)
+     * 描述:
+     *  1、主体为“党政、机关及事业单位/其他组织”时必填,请填写证件有效期。
+     *  2、若证件有效期为长期,请填写:长期。
+     *  3、结束时间需大于开始时间。
+     *  4、有效期必须大于60天,即结束时间距当前时间需超过60天。
+     *  示例值:[\"2014-01-01\",\"长期\"]
+     * 
+ */ + @SerializedName(value = "business_time") + private String businessTime; + + } + + @Data @NoArgsConstructor - public static class OrganizationCertInfo implements Serializable { - /** - *
-		 * 字段名:组织机构代码证照片
-		 * 变量名:organization_copy
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
-		 *  示例值:vByf3Gjm7KE53JXv\prrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
-		 * 
- */ - @SerializedName(value = "organization_copy") - private String organizationCopy; - - /** - *
-		 * 字段名:组织机构代码
-		 * 变量名:organization_number
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、请填写组织机构代码证上的组织机构代码。
-		 *  2、可填写9或10位 数字|字母|连字符。
-		 *  示例值:12345679-A
-		 * 
- */ - @SerializedName(value = "organization_number") - private String organizationNumber; - - /** - *
-		 * 字段名:组织机构代码有效期限
-		 * 变量名:organization_time
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、请填写组织机构代码证的有效期限,注意参照示例中的格式。
-		 *  2、若证件有效期为长期,请填写:长期。
-		 *  3、结束时间需大于开始时间。
-		 *  4、有效期必须大于60天,即结束时间距当前时间需超过60天。
-		 *  示例值:[\"2014-01-01\",\"长期\"]
-		 * 
- */ - @SerializedName(value = "organization_time") - private String organizationTime; - - } - - @Data + public static class OrganizationCertInfo implements Serializable { + /** + *
+     * 字段名:组织机构代码证照片
+     * 变量名:organization_copy
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
+     *  示例值:vByf3Gjm7KE53JXv\prrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
+     * 
+ */ + @SerializedName(value = "organization_copy") + private String organizationCopy; + + /** + *
+     * 字段名:组织机构代码
+     * 变量名:organization_number
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、请填写组织机构代码证上的组织机构代码。
+     *  2、可填写9或10位 数字|字母|连字符。
+     *  示例值:12345679-A
+     * 
+ */ + @SerializedName(value = "organization_number") + private String organizationNumber; + + /** + *
+     * 字段名:组织机构代码有效期限
+     * 变量名:organization_time
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、请填写组织机构代码证的有效期限,注意参照示例中的格式。
+     *  2、若证件有效期为长期,请填写:长期。
+     *  3、结束时间需大于开始时间。
+     *  4、有效期必须大于60天,即结束时间距当前时间需超过60天。
+     *  示例值:[\"2014-01-01\",\"长期\"]
+     * 
+ */ + @SerializedName(value = "organization_time") + private String organizationTime; + + } + + @Data @NoArgsConstructor - public static class IdCardInfo implements Serializable { - /** - *
-		 * 字段名:身份证人像面照片
-		 * 变量名:id_card_copy
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、请上传经营者/法定代表人的身份证人像面照片。
-		 *  2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
-		 *  示例值:xpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
-		 * 
- */ - @SerializedName(value = "id_card_copy") - private String idCardCopy; - - /** - *
-		 * 字段名:身份证国徽面照片
-		 * 变量名:id_card_national
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、请上传经营者/法定代表人的身份证国徽面照片。
-		 *  2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
-		 *  示例值:vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
-		 * 
- */ - @SerializedName(value = "id_card_national") - private String idCardNational; - - /** - *
-		 * 字段名:身份证姓名
-		 * 变量名:id_card_name
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、请填写经营者/法定代表人对应身份证的姓名,2~30个中文字符、英文字符、符号。
-		 *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
-		 *  示例值:pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==
-		 *  字段加密:使用APIv3定义的方式加密
-		 * 
- */ - @SerializedName(value = "id_card_name") + public static class IdCardInfo implements Serializable { + /** + *
+     * 字段名:身份证人像面照片
+     * 变量名:id_card_copy
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、请上传经营者/法定代表人的身份证人像面照片。
+     *  2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
+     *  示例值:xpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
+     * 
+ */ + @SerializedName(value = "id_card_copy") + private String idCardCopy; + + /** + *
+     * 字段名:身份证国徽面照片
+     * 变量名:id_card_national
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、请上传经营者/法定代表人的身份证国徽面照片。
+     *  2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+     *  示例值:vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
+     * 
+ */ + @SerializedName(value = "id_card_national") + private String idCardNational; + + /** + *
+     * 字段名:身份证姓名
+     * 变量名:id_card_name
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、请填写经营者/法定代表人对应身份证的姓名,2~30个中文字符、英文字符、符号。
+     *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+     *  示例值:pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==
+     *  字段加密:使用APIv3定义的方式加密
+     * 
+ */ + @SerializedName(value = "id_card_name") @SpecEncrypt - private String idCardName; - - /** - *
-		 * 字段名:身份证号码
-		 * 变量名:id_card_number
-		 * 是否必填:是
-		 * 类型:string(18)
-		 * 描述:
-		 *  1、请填写经营者/法定代表人对应身份证的号码。
-		 *  2、15位数字或17位数字+1位数字|X ,该字段需进行加密处理,加密方法详见敏感信息加密说明。
-		 *  示例值:zV+BEmytMNQCqQ8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==4
-		 *  特殊规则:长度最小15个字节
-		 * 
- */ - @SerializedName(value = "id_card_number") + private String idCardName; + + /** + *
+     * 字段名:身份证号码
+     * 变量名:id_card_number
+     * 是否必填:是
+     * 类型:string(18)
+     * 描述:
+     *  1、请填写经营者/法定代表人对应身份证的号码。
+     *  2、15位数字或17位数字+1位数字|X ,该字段需进行加密处理,加密方法详见敏感信息加密说明。
+     *  示例值:zV+BEmytMNQCqQ8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==4
+     *  特殊规则:长度最小15个字节
+     * 
+ */ + @SerializedName(value = "id_card_number") @SpecEncrypt - private String idCardNumber; - - /** - *
-		 * 字段名:身份证有效期限
-		 * 变量名:id_card_valid_time
-		 * 是否必填:是
-		 * 类型:string(128)
-		 * 描述:
-		 *  1、请填写身份证有效期的结束时间,注意参照示例中的格式。
-		 *  2、若证件有效期为长期,请填写:长期。
-		 *  3、证件有效期需大于60天。
-		 *  示例值:2026-06-06,长期
-		 * 
- */ - @SerializedName(value = "id_card_valid_time") - private String idCardValidTime; - - } - - @Data + private String idCardNumber; + + /** + *
+     * 字段名:身份证有效期限
+     * 变量名:id_card_valid_time
+     * 是否必填:是
+     * 类型:string(128)
+     * 描述:
+     *  1、请填写身份证有效期的结束时间,注意参照示例中的格式。
+     *  2、若证件有效期为长期,请填写:长期。
+     *  3、证件有效期需大于60天。
+     *  示例值:2026-06-06,长期
+     * 
+ */ + @SerializedName(value = "id_card_valid_time") + private String idCardValidTime; + + } + + @Data @NoArgsConstructor - public static class IdDocInfo implements Serializable { - /** - *
-		 * 字段名:证件姓名
-		 * 变量名:id_doc_name
-		 * 是否必填:是
-		 * 类型:string(128)
-		 * 描述:
-		 *  请填写经营者/法人姓名。
-		 *  示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4LC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
-		 * 
- */ - @SerializedName(value = "id_doc_name") - private String idDocName; - - /** - *
-		 * 字段名:证件号码
-		 * 变量名:id_doc_number
-		 * 是否必填:是
-		 * 类型:string(128)
-		 * 描述:
-		 *  7~11位 数字|字母|连字符 。
-		 *  示例值:jTpGmxUX3FBWVQ5NJTZvlKX_go0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
-		 * 
- */ - @SerializedName(value = "id_doc_number") - private String idDocNumber; - - /** - *
-		 * 字段名:证件照片
-		 * 变量名:id_doc_copy
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
-		 *  2、2M内的彩色图片,格式可为bmp、png、jpeg、jpg或gif 。
-		 *  示例值:xi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
-		 * 
- */ - @SerializedName(value = "id_doc_copy") - private String idDocCopy; - - /** - *
-		 * 字段名:证件结束日期
-		 * 变量名:doc_period_end
-		 * 是否必填:是
-		 * 类型:string(128)
-		 * 描述:
-		 *  1、请按照示例值填写。
-		 *  2、若证件有效期为长期,请填写:长期。
-		 *  3、证件有效期需大于60天 。
-		 *  示例值:2020-01-02
-		 * 
- */ - @SerializedName(value = "doc_period_end") - private String docPeriodEnd; - - } - - @Data + public static class IdDocInfo implements Serializable { + /** + *
+     * 字段名:证件姓名
+     * 变量名:id_doc_name
+     * 是否必填:是
+     * 类型:string(128)
+     * 描述:
+     *  请填写经营者/法人姓名。
+     *  示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4LC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
+     * 
+ */ + @SerializedName(value = "id_doc_name") + private String idDocName; + + /** + *
+     * 字段名:证件号码
+     * 变量名:id_doc_number
+     * 是否必填:是
+     * 类型:string(128)
+     * 描述:
+     *  7~11位 数字|字母|连字符 。
+     *  示例值:jTpGmxUX3FBWVQ5NJTZvlKX_go0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
+     * 
+ */ + @SerializedName(value = "id_doc_number") + private String idDocNumber; + + /** + *
+     * 字段名:证件照片
+     * 变量名:id_doc_copy
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。
+     *  2、2M内的彩色图片,格式可为bmp、png、jpeg、jpg或gif 。
+     *  示例值:xi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4
+     * 
+ */ + @SerializedName(value = "id_doc_copy") + private String idDocCopy; + + /** + *
+     * 字段名:证件结束日期
+     * 变量名:doc_period_end
+     * 是否必填:是
+     * 类型:string(128)
+     * 描述:
+     *  1、请按照示例值填写。
+     *  2、若证件有效期为长期,请填写:长期。
+     *  3、证件有效期需大于60天 。
+     *  示例值:2020-01-02
+     * 
+ */ + @SerializedName(value = "doc_period_end") + private String docPeriodEnd; + + } + + @Data @NoArgsConstructor - public static class AccountInfo implements Serializable { - /** - *
-		 * 字段名:账户类型
-		 * 变量名:bank_account_type
-		 * 是否必填:是
-		 * 类型:string(2)
-		 * 描述:
-		 *  1、若主体为企业/党政、机关及事业单位/其他组织,可填写:74-对公账户。
-		 *  2、若主体为小微,可填写:75-对私账户。
-		 *  3、若主体为个体工商户,可填写:74-对公账户或75-对私账户。
-		 *  示例值:75
-		 * 
- */ - @SerializedName(value = "bank_account_type") - private String bankAccountType; - - /** - *
-		 * 字段名:开户银行
-		 * 变量名:account_bank
-		 * 是否必填:是
-		 * 类型:string(10)
-		 * 描述:
-		 *  详细参见开户银行对照表。
-		 *  示例值:工商银行
-		 * 
- */ - @SerializedName(value = "account_bank") - private String accountBank; - - /** - *
-		 * 字段名:开户名称
-		 * 变量名:account_name
-		 * 是否必填:是
-		 * 类型:string(128)
-		 * 描述:
-		 *  1、选择经营者个人银行卡时,开户名称必须与身份证姓名一致。
-		 *  2、选择对公账户时,开户名称必须与营业执照上的“商户名称”一致。
-		 *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
-		 *  示例值:AOZdYGISxo4yw96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==
-		 * 
- */ - @SerializedName(value = "account_name") + public static class AccountInfo implements Serializable { + /** + *
+     * 字段名:账户类型
+     * 变量名:bank_account_type
+     * 是否必填:是
+     * 类型:string(2)
+     * 描述:
+     *  1、若主体为企业/党政、机关及事业单位/其他组织,可填写:74-对公账户。
+     *  2、若主体为小微,可填写:75-对私账户。
+     *  3、若主体为个体工商户,可填写:74-对公账户或75-对私账户。
+     *  示例值:75
+     * 
+ */ + @SerializedName(value = "bank_account_type") + private String bankAccountType; + + /** + *
+     * 字段名:开户银行
+     * 变量名:account_bank
+     * 是否必填:是
+     * 类型:string(10)
+     * 描述:
+     *  详细参见开户银行对照表。
+     *  示例值:工商银行
+     * 
+ */ + @SerializedName(value = "account_bank") + private String accountBank; + + /** + *
+     * 字段名:开户名称
+     * 变量名:account_name
+     * 是否必填:是
+     * 类型:string(128)
+     * 描述:
+     *  1、选择经营者个人银行卡时,开户名称必须与身份证姓名一致。
+     *  2、选择对公账户时,开户名称必须与营业执照上的“商户名称”一致。
+     *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+     *  示例值:AOZdYGISxo4yw96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==
+     * 
+ */ + @SerializedName(value = "account_name") @SpecEncrypt - private String accountName; - - /** - *
-		 * 字段名:开户银行省市编码
-		 * 变量名:bank_address_code
-		 * 是否必填:是
-		 * 类型:string(12)
-		 * 描述:
-		 *  至少精确到市,详细参见省市区编号对照表。
-		 *  示例值:110000
-		 * 
- */ - @SerializedName(value = "bank_address_code") - private String bankAddressCode; - - /** - *
-		 * 字段名:开户银行联行号
-		 * 变量名:bank_branch_id
-		 * 是否必填:条件选填
-		 * 类型:string(64)
-		 * 描述:
-		 *  1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。
-		 *  2、详细参见开户银行全称(含支行)对照表。
-		 *  示例值:402713354941
-		 * 
- */ - @SerializedName(value = "bank_branch_id") - private String bankBranchId; - - /** - *
-		 * 字段名:开户银行全称 (含支行)
-		 * 变量名:bank_name
-		 * 是否必填:条件选填
-		 * 类型:string(128)
-		 * 描述:
-		 *  1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。
-		 *  2、需填写银行全称,如"深圳农村商业银行XXX支行" 。
-		 *  3、详细参见开户银行全称(含支行)对照表。
-		 *  示例值:施秉县农村信用合作联社城关信用社
-		 * 
- */ - @SerializedName(value = "bank_name") - private String bankName; - - /** - *
-		 * 字段名:银行帐号
-		 * 变量名:account_number
-		 * 是否必填:是
-		 * 类型:string(128)
-		 * 描述:
-		 *  1、数字,长度遵循系统支持的对公/对私卡号长度要求表。
-		 *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
-		 *  示例值: d+xT+MQCvrLHUVDWv/8MR/dB7TkXLVfSrUxMPZy6jWWYzpRrEEaYQE8ZRGYoeorwC+w==
-		 * 
- */ - @SerializedName(value = "account_number") + private String accountName; + + /** + *
+     * 字段名:开户银行省市编码
+     * 变量名:bank_address_code
+     * 是否必填:是
+     * 类型:string(12)
+     * 描述:
+     *  至少精确到市,详细参见省市区编号对照表。
+     *  示例值:110000
+     * 
+ */ + @SerializedName(value = "bank_address_code") + private String bankAddressCode; + + /** + *
+     * 字段名:开户银行联行号
+     * 变量名:bank_branch_id
+     * 是否必填:条件选填
+     * 类型:string(64)
+     * 描述:
+     *  1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。
+     *  2、详细参见开户银行全称(含支行)对照表。
+     *  示例值:402713354941
+     * 
+ */ + @SerializedName(value = "bank_branch_id") + private String bankBranchId; + + /** + *
+     * 字段名:开户银行全称 (含支行)
+     * 变量名:bank_name
+     * 是否必填:条件选填
+     * 类型:string(128)
+     * 描述:
+     *  1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。
+     *  2、需填写银行全称,如"深圳农村商业银行XXX支行" 。
+     *  3、详细参见开户银行全称(含支行)对照表。
+     *  示例值:施秉县农村信用合作联社城关信用社
+     * 
+ */ + @SerializedName(value = "bank_name") + private String bankName; + + /** + *
+     * 字段名:银行帐号
+     * 变量名:account_number
+     * 是否必填:是
+     * 类型:string(128)
+     * 描述:
+     *  1、数字,长度遵循系统支持的对公/对私卡号长度要求表。
+     *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+     *  示例值: d+xT+MQCvrLHUVDWv/8MR/dB7TkXLVfSrUxMPZy6jWWYzpRrEEaYQE8ZRGYoeorwC+w==
+     * 
+ */ + @SerializedName(value = "account_number") @SpecEncrypt - private String accountNumber; + private String accountNumber; - } + } - @Data + @Data @NoArgsConstructor - public static class ContactInfo implements Serializable { - /** - *
-		 * 字段名:超级管理员类型
-		 * 变量名:contact_type
-		 * 是否必填:是
-		 * 类型:string(2)
-		 * 描述:
-		 *  1、小微商户,选择:65-法人/经营者。
-		 *  2、个体工商户/企业/党政、机关及事业单位/其他组织,可选择:65-法人/经营者、66- 负责人。 (负责人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。
-		 *  示例值:65
-		 * 
- */ - @SerializedName(value = "contact_type") - private String contactType; - - /** - *
-		 * 字段名:超级管理员姓名
-		 * 变量名:contact_name
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、若管理员类型为“法人”,则该姓名需与法人身份证姓名一致。
-		 *  2、若管理员类型为“经办人”,则可填写实际经办人的姓名。
-		 *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
-		 *  (后续该管理员需使用实名微信号完成签约)
-		 *  示例值: pVd1HJ6zyvPedzGaV+X3IdGdbDnuC4Eelw/wDa4SzfeespQO/0kjiwfqdfg==
-		 * 
- */ - @SerializedName(value = "contact_name") + public static class ContactInfo implements Serializable { + /** + *
+     * 字段名:超级管理员类型
+     * 变量名:contact_type
+     * 是否必填:是
+     * 类型:string(2)
+     * 描述:
+     *  1、小微商户,选择:65-法人/经营者。
+     *  2、个体工商户/企业/党政、机关及事业单位/其他组织,可选择:65-法人/经营者、66- 负责人。 (负责人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。
+     *  示例值:65
+     * 
+ */ + @SerializedName(value = "contact_type") + private String contactType; + + /** + *
+     * 字段名:超级管理员姓名
+     * 变量名:contact_name
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、若管理员类型为“法人”,则该姓名需与法人身份证姓名一致。
+     *  2、若管理员类型为“经办人”,则可填写实际经办人的姓名。
+     *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+     *  (后续该管理员需使用实名微信号完成签约)
+     *  示例值: pVd1HJ6zyvPedzGaV+X3IdGdbDnuC4Eelw/wDa4SzfeespQO/0kjiwfqdfg==
+     * 
+ */ + @SerializedName(value = "contact_name") @SpecEncrypt - private String contactName; - - /** - *
-		 * 字段名:超级管理员身份证件号码
-		 * 变量名:contact_id_card_number
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、若管理员类型为法人,则该身份证号码需与法人身份证号码一致。若管理员类型为经办人,则可填写实际经办人的身份证号码。
-		 *  2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。
-		 *  3、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。
-		 *  4、该字段需进行加密处理,加密方法详见敏感信息加密说明。
-		 *  示例值:pVd1HJ6zmty7/mYNxLMpRSvMRtelw/wDa4SzfeespQO/0kjiwfqdfg==
-		 * 
- */ - @SerializedName(value = "contact_id_card_number") + private String contactName; + + /** + *
+     * 字段名:超级管理员身份证件号码
+     * 变量名:contact_id_card_number
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、若管理员类型为法人,则该身份证号码需与法人身份证号码一致。若管理员类型为经办人,则可填写实际经办人的身份证号码。
+     *  2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。
+     *  3、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。
+     *  4、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+     *  示例值:pVd1HJ6zmty7/mYNxLMpRSvMRtelw/wDa4SzfeespQO/0kjiwfqdfg==
+     * 
+ */ + @SerializedName(value = "contact_id_card_number") @SpecEncrypt - private String contactIdCardNumber; - - /** - *
-		 * 字段名:超级管理员手机
-		 * 变量名:mobile_phone
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、请填写管理员的手机号,11位数字, 用于接收微信支付的重要管理信息及日常操作验证码 。
-		 *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
-		 *  示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiNWWNeespQO/0kjiwfqdfg==
-		 * 
- */ - @SerializedName(value = "mobile_phone") + private String contactIdCardNumber; + + /** + *
+     * 字段名:超级管理员手机
+     * 变量名:mobile_phone
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、请填写管理员的手机号,11位数字, 用于接收微信支付的重要管理信息及日常操作验证码 。
+     *  2、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+     *  示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiNWWNeespQO/0kjiwfqdfg==
+     * 
+ */ + @SerializedName(value = "mobile_phone") @SpecEncrypt - private String mobilePhone; - - /** - *
-		 * 字段名:超级管理员邮箱
-		 * 变量名:contact_email
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  1、用于接收微信支付的开户邮件及日常业务通知。
-		 *  2、需要带@,遵循邮箱格式校验 。
-		 *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
-		 *  示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+FWWNUlw/wDa4SzfeespQO/0kjiwfqdfg==
-		 * 
- */ - @SerializedName(value = "contact_email") + private String mobilePhone; + + /** + *
+     * 字段名:超级管理员邮箱
+     * 变量名:contact_email
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  1、用于接收微信支付的开户邮件及日常业务通知。
+     *  2、需要带@,遵循邮箱格式校验 。
+     *  3、该字段需进行加密处理,加密方法详见敏感信息加密说明。
+     *  示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+FWWNUlw/wDa4SzfeespQO/0kjiwfqdfg==
+     * 
+ */ + @SerializedName(value = "contact_email") @SpecEncrypt - private String contactEmail; + private String contactEmail; - } + } - @Data + @Data @NoArgsConstructor - public static class SalesSceneInfo implements Serializable { - /** - *
-		 * 字段名:店铺名称
-		 * 变量名:store_name
-		 * 是否必填:是
-		 * 类型:string(256)
-		 * 描述:
-		 *  请填写店铺全称。
-		 *  示例值:爱烧烤
-		 * 
- */ - @SerializedName(value = "store_name") - private String storeName; - - /** - *
-		 * 字段名:店铺链接
-		 * 变量名:store_url
-		 * 是否必填:二选一
-		 * 类型:string(1024)
-		 * 描述:
-		 *  1、店铺二维码or店铺链接二选一必填。
-		 *  2、请填写店铺主页链接,需符合网站规范。
-		 *  示例值:http://www.qq.com
-		 * 
- */ - @SerializedName(value = "store_url") - private String storeUrl; - - /** - *
-		 * 字段名:店铺二维码
-		 * 变量名:store_qr_code
-		 * 是否必填:1、店铺二维码 or 店铺链接二选一必填。 2、若为电商小程序,可上传店铺页面的小程序二维码。 3、请填写通过图片上传接口预先上传图片生成好的MediaID,仅能上传1张图片 。 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO1D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
-		 * 类型:string(256)
-		 * 描述:
-		 * 
- */ - @SerializedName(value = "store_qr_code") - private String storeQrCode; - - } + public static class SalesSceneInfo implements Serializable { + /** + *
+     * 字段名:店铺名称
+     * 变量名:store_name
+     * 是否必填:是
+     * 类型:string(256)
+     * 描述:
+     *  请填写店铺全称。
+     *  示例值:爱烧烤
+     * 
+ */ + @SerializedName(value = "store_name") + private String storeName; + + /** + *
+     * 字段名:店铺链接
+     * 变量名:store_url
+     * 是否必填:二选一
+     * 类型:string(1024)
+     * 描述:
+     *  1、店铺二维码or店铺链接二选一必填。
+     *  2、请填写店铺主页链接,需符合网站规范。
+     *  示例值:http://www.qq.com
+     * 
+ */ + @SerializedName(value = "store_url") + private String storeUrl; + + /** + *
+     * 字段名:店铺二维码
+     * 变量名:store_qr_code
+     * 是否必填:1、店铺二维码 or 店铺链接二选一必填。 2、若为电商小程序,可上传店铺页面的小程序二维码。 3、请填写通过图片上传接口预先上传图片生成好的MediaID,仅能上传1张图片 。 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO1D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ
+     * 类型:string(256)
+     * 描述:
+     * 
+ */ + @SerializedName(value = "store_qr_code") + private String storeQrCode; + + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java index dd2d46122c..38c8a33745 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java @@ -12,7 +12,7 @@ @Data @NoArgsConstructor public class ApplymentsResult implements Serializable { - + private static final long serialVersionUID = -4549193755252593150L; /** *
    * 字段名:微信支付申请单号
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java
index 00967cfa67..7defd21452 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java
@@ -144,7 +144,8 @@ public class ApplymentsStatusResult implements Serializable {
 
   @Data
   @NoArgsConstructor
-  public static class AccountValidation implements Serializable{
+  public static class AccountValidation implements Serializable {
+    private static final long serialVersionUID = 4379880030965808588L;
     /**
      * 
      * 字段名:付款户名
@@ -275,7 +276,8 @@ public static class AccountValidation implements Serializable{
 
   @Data
   @NoArgsConstructor
-  public static class AuditDetail implements Serializable{
+  public static class AuditDetail implements Serializable {
+    private static final long serialVersionUID = 5446130564359386809L;
     /**
      * 
      * 字段名:参数名称
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java
index 2187de0c09..4cb6785ffd 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java
@@ -10,18 +10,16 @@
  * @author zhouyongshen
  */
 public interface Applyment4SubService {
-    /**
-     * 提交申请单API
-     * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_1.shtml
-     * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/
-     *
-     * @param request 请求对象
-     * @return WxPayApplymentCreateResult 响应结果
-     * @throws WxPayException the wx pay exception
-     */
-    WxPayApplymentCreateResult createApply(WxPayApplyment4SubCreateRequest request) throws WxPayException;
-
-
+  /**
+   * 提交申请单API
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_1.shtml
+   * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/
+   *
+   * @param request 请求对象
+   * @return WxPayApplymentCreateResult 响应结果
+   * @throws WxPayException the wx pay exception
+   */
+  WxPayApplymentCreateResult createApply(WxPayApplyment4SubCreateRequest request) throws WxPayException;
 
   /**
    * 通过业务申请编号查询申请状态
@@ -29,11 +27,13 @@ public interface Applyment4SubService {
    * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/business_code/{business_code}
    *
    * @param businessCode 业务申请编号
-   *                     1、只能由数字、字母或下划线组成,建议前缀为服务商商户号。
-   *                     2、服务商自定义的唯一编号。
-   *                     3、每个编号对应一个申请单,每个申请单审核通过后生成一个微信支付商户号。
-   *                     4、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息。
-   *                     示例值:1900013511_10000
+   *  1、只能由数字、字母或下划线组成,建议前缀为服务商商户号。
+   *  2、服务商自定义的唯一编号。
+   *  3、每个编号对应一个申请单,每个申请单审核通过后生成一个微信支付商户号。
+   *  4、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息。
+   *  示例值:1900013511_10000
+   * @return the applyment state query result
+   * @throws WxPayException the wx pay exception
    */
   ApplymentStateQueryResult queryApplyStatusByBusinessCode(String businessCode) throws WxPayException;
 
@@ -43,6 +43,8 @@ public interface Applyment4SubService {
    * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/applyment_id/{applyment_id}
    *
    * @param applymentId 微信支付分的申请单号。示例值:2000001234567890
+   * @return the applyment state query result
+   * @throws WxPayException the wx pay exception
    */
   ApplymentStateQueryResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException;
 
@@ -52,6 +54,8 @@ public interface Applyment4SubService {
    * 接口链接:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/settlement
    *
    * @param subMchid 本服务商进件、已签约的特约商户号。
+   * @return the settlement info result
+   * @throws WxPayException the wx pay exception
    */
   SettlementInfoResult querySettlementBySubMchid(String subMchid) throws WxPayException;
 
@@ -59,9 +63,11 @@ public interface Applyment4SubService {
    * 修改结算帐号
    * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_3.shtml
    * 接口链接:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/modify-settlement
+   *
    * @param subMchid 特约商户号
-   * @param request 修改结算账户请求对象信息
+   * @param request  修改结算账户请求对象信息
+   * @throws WxPayException the wx pay exception
    */
-  void modifySettlement(String subMchid,ModifySettlementRequest request) throws WxPayException;
+  void modifySettlement(String subMchid, ModifySettlementRequest request) throws WxPayException;
 
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java
index f1bdb2b3eb..5c86306b9f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java
@@ -24,7 +24,8 @@ public interface EcommerceService {
    * 
* * @param request 请求对象 - * @return . + * @return . applyments result + * @throws WxPayException the wx pay exception */ ApplymentsResult createApply(ApplymentsRequest request) throws WxPayException; @@ -36,7 +37,8 @@ public interface EcommerceService { *
* * @param applymentId 申请单ID - * @return . + * @return . applyments status result + * @throws WxPayException the wx pay exception */ ApplymentsStatusResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException; @@ -48,7 +50,8 @@ public interface EcommerceService { *
* * @param outRequestNo 业务申请编号 - * @return . + * @return . applyments status result + * @throws WxPayException the wx pay exception */ ApplymentsStatusResult queryApplyStatusByOutRequestNo(String outRequestNo) throws WxPayException; diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java index 0c7e3821ba..9631631272 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java @@ -9,21 +9,14 @@ import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import lombok.RequiredArgsConstructor; import java.net.URI; +@RequiredArgsConstructor public class EcommerceServiceImpl implements EcommerceService { - private static final Gson GSON = new GsonBuilder().create(); - private WxPayService payService; - - /** - * - * @param payService - */ - public EcommerceServiceImpl(WxPayService payService) { - this.payService = payService; - } + private final WxPayService payService; @Override public ApplymentsResult createApply(ApplymentsRequest request) throws WxPayException { diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java index aadb051410..c037134732 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java @@ -128,10 +128,10 @@ public String postV3WithWechatpaySerial(String url, String requestStr) throws Wx try (CloseableHttpResponse response = httpClient.execute(httpPost)) { //v3已经改为通过状态码判断200 204 成功 int statusCode = response.getStatusLine().getStatusCode(); - String responseString="{}"; + String responseString = "{}"; HttpEntity entity = response.getEntity(); - if(entity!=null){ - responseString= EntityUtils.toString(entity, StandardCharsets.UTF_8); + if (entity != null) { + responseString = EntityUtils.toString(entity, StandardCharsets.UTF_8); } if (HttpStatus.SC_OK == statusCode || HttpStatus.SC_NO_CONTENT == statusCode) { @@ -261,7 +261,7 @@ private void initSSLContext(HttpClientBuilder httpClientBuilder) throws WxPayExc } SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, - new DefaultHostnameVerifier()); + new DefaultHostnameVerifier()); httpClientBuilder.setSSLSocketFactory(connectionSocketFactory); } From 817b474dd029ff493743b18bc3bd33541d990fca Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 22 Aug 2020 22:17:52 +0800 Subject: [PATCH 84/90] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E7=BB=9F=E4=B8=80=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applyment/ModifySettlementRequest.java | 64 +- .../bean/applyment/SettlementInfoResult.java | 61 +- .../WxPayApplyment4SubCreateRequest.java | 1439 +++++++++-------- .../applyment/WxPayApplymentCreateResult.java | 12 +- .../bean/applyment/enums/AccountTypeEnum.java | 18 +- .../applyment/enums/ApplymentStateEnum.java | 64 +- .../applyment/enums/BankAccountTypeEnum.java | 18 +- .../bean/applyment/enums/CertTypeEnum.java | 106 +- .../bean/applyment/enums/IdTypeEnum.java | 42 +- .../applyment/enums/SalesScenesTypeEnum.java | 50 +- .../enums/SettlementVerifyResultEnum.java | 26 +- .../bean/applyment/enums/SubjectTypeEnum.java | 34 +- 12 files changed, 972 insertions(+), 962 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java index 3ec162b0a5..8623b5cd67 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java @@ -1,13 +1,13 @@ package com.github.binarywang.wxpay.bean.applyment; import com.github.binarywang.wxpay.bean.applyment.enums.AccountTypeEnum; +import com.github.binarywang.wxpay.v3.SpecEncrypt; import com.google.gson.annotations.SerializedName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import com.github.binarywang.wxpay.v3.SpecEncrypt; import java.io.Serializable; @@ -21,36 +21,36 @@ @Accessors(chain = true) public class ModifySettlementRequest implements Serializable { private static final long serialVersionUID = 4568552340365230872L; - /** - *账户类型 - */ - @SerializedName("account_type") - private AccountTypeEnum accountType; - /** - *开户银行 - */ - @SerializedName("account_bank") - private String accountBank; - /** - *开户银行省市编码 - */ - @SerializedName("bank_address_code") - private String bankAddressCode; - /** - *开户银行全称(含支行) - */ - @SerializedName("bank_name") - private String bankName; - /** - *开户银行联行号 - */ - @SerializedName("bank_branch_id") - private String bankBranchId; + /** + * 账户类型 + */ + @SerializedName("account_type") + private AccountTypeEnum accountType; + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + * 开户银行省市编码 + */ + @SerializedName("bank_address_code") + private String bankAddressCode; + /** + * 开户银行全称(含支行) + */ + @SerializedName("bank_name") + private String bankName; + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; - /** - *银行账号 - */ - @SpecEncrypt - @SerializedName("account_number") - private String accountNumber; + /** + * 银行账号 + */ + @SpecEncrypt + @SerializedName("account_number") + private String accountNumber; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java index 0e35d2433c..ffa3bf73e7 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java @@ -20,34 +20,35 @@ public class SettlementInfoResult implements Serializable { private static final long serialVersionUID = 4568552340365230872L; /** - * 账户类型 - */ - @SerializedName("account_type") - private String accountType; - /** - * 开户银行 - */ - @SerializedName("account_bank") - private String accountBank; - /** - * 开户银行全称(含支行] - */ - @SerializedName("bank_name") - private String bankName; - /** - * 开户银行联行号 - */ - @SerializedName("bank_branch_id") - private String bankBranchId; - /** - * 银行账号 - */ - @SerializedName("account_number") - private String accountNumber; - /** - * 汇款验证结果 - * @see com.github.binarywang.wxpay.bean.applyment.enums.SettlementVerifyResultEnum - */ - @SerializedName("verify_result") - private String verifyResult; + * 账户类型 + */ + @SerializedName("account_type") + private String accountType; + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + * 开户银行全称(含支行] + */ + @SerializedName("bank_name") + private String bankName; + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + /** + * 银行账号 + */ + @SerializedName("account_number") + private String accountNumber; + /** + * 汇款验证结果 + * + * @see com.github.binarywang.wxpay.bean.applyment.enums.SettlementVerifyResultEnum + */ + @SerializedName("verify_result") + private String verifyResult; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java index cfdbdd8ed8..8fa1aa0caa 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java @@ -1,13 +1,13 @@ package com.github.binarywang.wxpay.bean.applyment; import com.github.binarywang.wxpay.bean.applyment.enums.*; +import com.github.binarywang.wxpay.v3.SpecEncrypt; import com.google.gson.annotations.SerializedName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import com.github.binarywang.wxpay.v3.SpecEncrypt; import java.io.Serializable; import java.util.List; @@ -23,861 +23,868 @@ @AllArgsConstructor @Accessors(chain = true) public class WxPayApplyment4SubCreateRequest implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 业务申请编号 + */ + @SerializedName("business_code") + private String businessCode; + /** + * 超级管理员信息 + */ + @SerializedName("contact_info") + @SpecEncrypt + private ContactInfo contactInfo; + + /** + * 主体资料 + */ + @SerializedName("subject_info") + @SpecEncrypt + private SubjectInfo subjectInfo; + + /** + * 经营资料 + */ + @SerializedName("business_info") + private BusinessInfo businessInfo; + + /** + * 结算规则 + */ + @SerializedName("settlement_info") + private SettlementInfo settlementInfo; + + /** + * 结算银行账户 + */ + @SerializedName("bank_account_info") + @SpecEncrypt + private BankAccountInfo bankAccountInfo; + + /** + * 结算银行账户 + */ + @SerializedName("addition_info") + private AdditionInfo additionInfo; + + /** + * 超级管理员需在开户后进行签约,并接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class ContactInfo implements Serializable { private static final long serialVersionUID = 1L; /** - * 业务申请编号 + * 超级管理员姓名 */ - @SerializedName("business_code") - private String businessCode; + @SerializedName("contact_name") + @SpecEncrypt + private String contactName; + /** - * 超级管理员信息 + * 超级管理员身份证件号码 + * 1、“超级管理员身份证号码”与“超级管理员微信openid”,二选一必填。 + * 2、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。 + * 3、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。 */ - @SerializedName("contact_info") + @SerializedName("contact_id_number") @SpecEncrypt - private ContactInfo contactInfo; + private String contactIdNumber; + + /** + * 超级管理员微信openid + * 1、“超级管理员身份证件号码”与“超级管理员微信openid”,二选一必填。 + * 2、超级管理员签约时,校验微信号是否与该微信openid一致。 + */ + @SerializedName("openid") + private String openid; /** - * 主体资料 + * 1、11位数字。 + * 2、用于接收微信支付的重要管理信息及日常操作验证码。 */ - @SerializedName("subject_info") + @SerializedName("mobile_phone") @SpecEncrypt - private SubjectInfo subjectInfo; + private String mobilePhone; /** - * 经营资料 + * 1、用于接收微信支付的开户邮件及日常业务通知。 + * 2、需要带@,遵循邮箱格式校验,该字段需进行加密处理, */ - @SerializedName("business_info") - private BusinessInfo businessInfo; + @SerializedName("contact_email") + @SpecEncrypt + private String contactEmail; + + } + + /** + * 主体资料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SubjectInfo implements Serializable { + private static final long serialVersionUID = 1L; /** - * 结算规则 + * 主体类型 */ - @SerializedName("settlement_info") - private SettlementInfo settlementInfo; + @SerializedName("subject_type") + private SubjectTypeEnum subjectType; /** - * 结算银行账户 + * 营业执照 */ - @SerializedName("bank_account_info") - @SpecEncrypt - private BankAccountInfo bankAccountInfo; + @SerializedName("business_license_info") + private BusinessLicenseInfo businessLicenseInfo; + /** + * 登记证书 + */ + @SerializedName("certificate_info") + private CertificateInfo certificateInfo; /** - * 结算银行账户 + * 组织机构代码证 */ - @SerializedName("addition_info") - private AdditionInfo additionInfo; + @SerializedName("organization_info") + private OrganizationInfo organizationInfo; /** - * 超级管理员需在开户后进行签约,并接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。 + * 单位证明函照片 */ + @SerializedName("certificate_letter_copy") + private String certificateLetterCopy; + + /** + * 经营者/法人身份证件 + */ + @SerializedName("identity_info") + @SpecEncrypt + private IdentityInfo identityInfo; + + /** + * 最终受益人信息(UBO] + */ + @SerializedName("ubo_info") + @SpecEncrypt + private UboInfo uboInfo; + + @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class ContactInfo implements Serializable { - private static final long serialVersionUID = 1L; + public static class BusinessLicenseInfo implements Serializable { + private static final long serialVersionUID = -1016615300418945838L; + /** + * 营业执照照片 + */ + @SerializedName("license_copy") + private String licenseCopy; + /** + * 注册号/统一社会信用代码 + */ + @SerializedName("license_number") + private String licenseNumber; + /** + * 商户名称 + */ + @SerializedName("merchant_name") + private String merchantName; + /** + * 个体户经营者/法人姓名 + */ + @SerializedName("legal_person") + private String legalPerson; + } - /** - * 超级管理员姓名 - */ - @SerializedName("contact_name") - @SpecEncrypt - private String contactName; + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class CertificateInfo implements Serializable { + private static final long serialVersionUID = 5080675335337916895L; - /** - * 超级管理员身份证件号码 - * 1、“超级管理员身份证号码”与“超级管理员微信openid”,二选一必填。 - * 2、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。 - * 3、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。 - */ - @SerializedName("contact_id_number") - @SpecEncrypt - private String contactIdNumber; + /** + * 登记证书照片 + */ + @SerializedName("cert_copy") + private String certCopy; - /** - * 超级管理员微信openid - * 1、“超级管理员身份证件号码”与“超级管理员微信openid”,二选一必填。 - * 2、超级管理员签约时,校验微信号是否与该微信openid一致。 - */ - @SerializedName("openid") - private String openid; + /** + * 登记证书类型 + */ + @SerializedName("cert_type") + private CertTypeEnum certType; - /** - * 1、11位数字。 - * 2、用于接收微信支付的重要管理信息及日常操作验证码。 - */ - @SerializedName("mobile_phone") - @SpecEncrypt - private String mobilePhone; - /** - * 1、用于接收微信支付的开户邮件及日常业务通知。 - * 2、需要带@,遵循邮箱格式校验,该字段需进行加密处理, - */ - @SerializedName("contact_email") - @SpecEncrypt - private String contactEmail; + /** + * 证书号 + */ + @SerializedName("cert_number") + private String certNumber; + + + /** + * 商户名称 + */ + @SerializedName("merchant_name") + private String merchantName; + + + /** + * 注册地址 + */ + @SerializedName("company_address") + private String companyAddress; + + + /** + * 法人姓名 + */ + @SerializedName("legal_person") + private String legalPerson; + + + /** + * 有效期限开始日期 + */ + @SerializedName("period_begin") + private String periodBegin; + + + /** + * 有效期限结束日期 + */ + @SerializedName("period_end") + private String periodEnd; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class OrganizationInfo implements Serializable { + private static final long serialVersionUID = 6497045652770046337L; + /** + * 组织机构代码证照片 + */ + @SerializedName("organization_copy") + private String organizationCopy; + /** + * 组织机构代码 + */ + @SerializedName("organization_code") + private String organizationCode; + /** + * 组织机构代码证有效期开始日期 + */ + @SerializedName("org_period_begin") + private String orgPeriodBegin; + /** + * 组织机构代码证有效期结束日期 + */ + @SerializedName("org_period_end") + private String orgPeriodEnd; } - /** - * 主体资料 - */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class SubjectInfo implements Serializable { - private static final long serialVersionUID = 1L; + public static class IdentityInfo implements Serializable { + private static final long serialVersionUID = 1683704338370383827L; + + /** + * 证件类型 + */ + @SerializedName("id_doc_type") + private IdTypeEnum idDocType; + + /** + * 身份证信息 + */ + @SerializedName("id_card_info") + @SpecEncrypt + private IdCardInfo idCardInfo; + + /** + * 其他类型证件信息 + */ + @SerializedName("id_doc_info") + @SpecEncrypt + private IdDocInfo idDocInfo; + + /** + * 经营者/法人是否为受益人 + */ + @SerializedName("owner") + private boolean owner; + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdCardInfo implements Serializable { + private static final long serialVersionUID = -2897792705297641786L; /** - * 主体类型 + * 身份证人像面照片 */ - @SerializedName("subject_type") - private SubjectTypeEnum subjectType; + @SerializedName("id_card_copy") + private String idCardCopy; + /** + * 身份证国徽面照片 + */ + @SerializedName("id_card_national") + private String idCardNational; /** - * 营业执照 + * 身份证姓名 */ - @SerializedName("business_license_info") - private BusinessLicenseInfo businessLicenseInfo; + @SerializedName("id_card_name") + @SpecEncrypt + private String idCardName; /** - * 登记证书 + * 身份证号码 */ - @SerializedName("certificate_info") - private CertificateInfo certificateInfo; - + @SerializedName("id_card_number") + @SpecEncrypt + private String idCardNumber; + /** + * 身份证有效期开始时间 + */ + @SerializedName("card_period_begin") + private String cardPeriodBegin; /** - * 组织机构代码证 + * 身份证有效期结束时间 */ - @SerializedName("organization_info") - private OrganizationInfo organizationInfo; + @SerializedName("card_period_end") + private String cardPeriodEnd; + + } + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdDocInfo implements Serializable { + private static final long serialVersionUID = 7335589815924447719L; /** - * 单位证明函照片 + * 证件照片 */ - @SerializedName("certificate_letter_copy") - private String certificateLetterCopy; + @SerializedName("id_doc_copy") + private String idDocCopy; /** - * 经营者/法人身份证件 + * 证件姓名 */ - @SerializedName("identity_info") + @SerializedName("id_doc_name") @SpecEncrypt - private IdentityInfo identityInfo; + private String idDocName; /** - * 最终受益人信息(UBO] + * 证件号码 */ - @SerializedName("ubo_info") + @SerializedName("id_doc_number") @SpecEncrypt - private UboInfo uboInfo; - - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class BusinessLicenseInfo { - /** - * 营业执照照片 - */ - @SerializedName("license_copy") - private String licenseCopy; - /** - * 注册号/统一社会信用代码 - */ - @SerializedName("license_number") - private String licenseNumber; - /** - * 商户名称 - */ - @SerializedName("merchant_name") - private String merchantName; - /** - * 个体户经营者/法人姓名 - */ - @SerializedName("legal_person") - private String legalPerson; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class CertificateInfo { - - /** - * 登记证书照片 - */ - @SerializedName("cert_copy") - private String certCopy; - - /** - * 登记证书类型 - */ - @SerializedName("cert_type") - private CertTypeEnum certType; - - - /** - * 证书号 - */ - @SerializedName("cert_number") - private String certNumber; - - - /** - * 商户名称 - */ - @SerializedName("merchant_name") - private String merchantName; - - - /** - * 注册地址 - */ - @SerializedName("company_address") - private String companyAddress; - - - /** - * 法人姓名 - */ - @SerializedName("legal_person") - private String legalPerson; - - - /** - * 有效期限开始日期 - */ - @SerializedName("period_begin") - private String periodBegin; - - - /** - * 有效期限结束日期 - */ - @SerializedName("period_end") - private String periodEnd; - - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class OrganizationInfo { - /** - * 组织机构代码证照片 - */ - @SerializedName("organization_copy") - private String organizationCopy; - /** - * 组织机构代码 - */ - @SerializedName("organization_code") - private String organizationCode; - /** - * 组织机构代码证有效期开始日期 - */ - @SerializedName("org_period_begin") - private String orgPeriodBegin; - /** - * 组织机构代码证有效期结束日期 - */ - @SerializedName("org_period_end") - private String orgPeriodEnd; - - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class IdentityInfo { - - /** - * 证件类型 - */ - @SerializedName("id_doc_type") - private IdTypeEnum idDocType; - - /** - * 身份证信息 - */ - @SerializedName("id_card_info") - @SpecEncrypt - private IdCardInfo idCardInfo; - - /** - * 其他类型证件信息 - */ - @SerializedName("id_doc_info") - @SpecEncrypt - private IdDocInfo idDocInfo; - - /** - * 经营者/法人是否为受益人 - */ - @SerializedName("owner") - private boolean owner; - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class IdCardInfo { - /** - * 身份证人像面照片 - */ - @SerializedName("id_card_copy") - private String idCardCopy; - /** - * 身份证国徽面照片 - */ - @SerializedName("id_card_national") - private String idCardNational; - - /** - * 身份证姓名 - */ - @SerializedName("id_card_name") - @SpecEncrypt - private String idCardName; - /** - * 身份证号码 - */ - @SerializedName("id_card_number") - @SpecEncrypt - private String idCardNumber; - /** - * 身份证有效期开始时间 - */ - @SerializedName("card_period_begin") - private String cardPeriodBegin; - /** - * 身份证有效期结束时间 - */ - @SerializedName("card_period_end") - private String cardPeriodEnd; - - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class IdDocInfo { - /** - * 证件照片 - */ - @SerializedName("id_doc_copy") - private String idDocCopy; - - /** - * 证件姓名 - */ - @SerializedName("id_doc_name") - @SpecEncrypt - private String idDocName; - - /** - * 证件号码 - */ - @SerializedName("id_doc_number") - @SpecEncrypt - private String idDocNumber; - /** - * 证件有效期开始时间 - */ - @SerializedName("doc_period_begin") - private String docPeriodBegin; - /** - * 证件有效期结束时间 - */ - @SerializedName("doc_period_end") - private String docPeriodEnd; - } - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class UboInfo { - /** - * 证件类型 - */ - @SerializedName("id_type") - private IdTypeEnum idType; - /** - * 身份证人像面照片 - */ - @SerializedName("id_card_copy") - private String idCardCopy; - /** - * 身份证国徽面照片 - */ - @SerializedName("id_card_national") - private String idCardNational; - /** - * 证件照片 - */ - @SerializedName("id_doc_copy") - private String idDocCopy; - /** - * 受益人姓名 - */ - @SerializedName("name") - @SpecEncrypt - private String name; - /** - * 证件号码 - */ - @SerializedName("id_number") - @SpecEncrypt - private String idNumber; - /** - * 证件有效期开始时间 - */ - @SerializedName("id_period_begin") - private String idPeriodBegin; - /** - * 证件有效期结束时间 - */ - @SerializedName("id_period_end") - private String idPeriodEnd; - } - + private String idDocNumber; + /** + * 证件有效期开始时间 + */ + @SerializedName("doc_period_begin") + private String docPeriodBegin; + /** + * 证件有效期结束时间 + */ + @SerializedName("doc_period_end") + private String docPeriodEnd; + } } - /** - * 经营资料 - */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class BusinessInfo implements Serializable { - private static final long serialVersionUID = 1L; + public static class UboInfo implements Serializable { + private static final long serialVersionUID = 7918585690831975042L; + /** + * 证件类型 + */ + @SerializedName("id_type") + private IdTypeEnum idType; + /** + * 身份证人像面照片 + */ + @SerializedName("id_card_copy") + private String idCardCopy; + /** + * 身份证国徽面照片 + */ + @SerializedName("id_card_national") + private String idCardNational; + /** + * 证件照片 + */ + @SerializedName("id_doc_copy") + private String idDocCopy; + /** + * 受益人姓名 + */ + @SerializedName("name") + @SpecEncrypt + private String name; + /** + * 证件号码 + */ + @SerializedName("id_number") + @SpecEncrypt + private String idNumber; + /** + * 证件有效期开始时间 + */ + @SerializedName("id_period_begin") + private String idPeriodBegin; + /** + * 证件有效期结束时间 + */ + @SerializedName("id_period_end") + private String idPeriodEnd; + } - /** - * 商户简称 - */ - @SerializedName("merchant_shortname") - private String merchantShortname; + } + + /** + * 经营资料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BusinessInfo implements Serializable { + private static final long serialVersionUID = 1L; - /** - * 客服电话 - */ - @SerializedName("service_phone") - private String servicePhone; + /** + * 商户简称 + */ + @SerializedName("merchant_shortname") + private String merchantShortname; - /** - * 经营场景 - */ - @SerializedName("sales_info") - private SalesInfo salesInfo; - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class SalesInfo { - - /** - * 经营场景类型 - */ - @SerializedName("sales_scenes_type") - private List salesScenesType; - - /** - * 线下门店场景 - */ - @SerializedName("biz_store_info") - private BizStoreInfo bizStoreInfo; - - /** - * 公众号场景 - */ - @SerializedName("mp_info") - private MpInfo mpInfo; - - /** - * 小程序场景 - */ - @SerializedName("mini_program_info") - private MiniProgramInfo miniProgramInfo; - - /** - * APP场景 - */ - @SerializedName("app_info") - private AppInfo appInfo; - - /** - * 互联网网站场景 - */ - @SerializedName("web_info") - private WebInfo webInfo; - - /** - * 企业微信场景 - */ - @SerializedName("wework_info") - private WeworkInfo weworkInfo; - - /** - * 线下门店场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class BizStoreInfo { - - /** - * 门店名称 - */ - @SerializedName("biz_store_name") - private String bizStoreName; - - /** - * 门店省市编码 - */ - @SerializedName("biz_address_code") - private String bizAddressCode; - - /** - * 门店地址 - */ - @SerializedName("biz_store_address") - private String bizStoreAddress; - - /** - * 门店门头照片 - */ - @SerializedName("store_entrance_pic") - private List storeEntrancePic; - - /** - * 店内环境照片 - */ - @SerializedName("indoor_pic") - private List indoorPic; - - /** - * 线下场所对应的商家APPID - */ - @SerializedName("biz_sub_appid") - private String bizSubAppid; - - } - - /** - * 公众号场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class MpInfo { - - /** - * 服务商公众号APPID - */ - @SerializedName("mp_appid") - private String mpAppid; - - /** - * 商家公众号APPID - */ - @SerializedName("mp_sub_appid") - private String mpSubAppid; - - /** - * 公众号页面截图 - */ - @SerializedName("mp_pics") - private List mpPics; - - } - - /** - * 小程序场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class MiniProgramInfo { - - /** - * 服务商小程序APPID - */ - @SerializedName("mini_program_appid") - private String miniProgramAppid; - - /** - * 商家小程序APPID - */ - @SerializedName("mini_program_sub_appid") - private String miniProgramSubAppid; - - /** - * 小程序截图 - */ - @SerializedName("mini_program_pics") - private List miniProgramPics; - - - } - - /** - * APP场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class AppInfo { - - /** - * 服务商应用APPID - */ - @SerializedName("app_appid") - private String appAppid; - - /** - * 商家应用APPID - */ - @SerializedName("app_sub_appid") - private String appSubAppid; - - /** - * APP截图 - */ - @SerializedName("app_pics") - private List appPics; - - } - - /** - * 互联网网站场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class WebInfo { - - /** - * 互联网网站域名 - */ - @SerializedName("domain") - private String domain; - - /** - * 网站授权函 - */ - @SerializedName("web_authorisation") - private String webAuthorisation; - - /** - * 互联网网站对应的商家APPID - */ - @SerializedName("web_appid") - private String webAppid; - - } - - /** - * 企业微信场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class WeworkInfo { - - /** - * 商家企业微信CorpID - */ - @SerializedName("sub_corp_id") - private String subCorpId; - - /** - * 企业微信页面截图 - */ - @SerializedName("wework_pics") - private List weworkPics; - - } - } - } + /** + * 客服电话 + */ + @SerializedName("service_phone") + private String servicePhone; /** - * 结算规则 + * 经营场景 */ + @SerializedName("sales_info") + private SalesInfo salesInfo; + @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class SettlementInfo implements Serializable { - private static final long serialVersionUID = 1L; + public static class SalesInfo implements Serializable { + private static final long serialVersionUID = 6428044729204137659L; + /** + * 经营场景类型 + */ + @SerializedName("sales_scenes_type") + private List salesScenesType; + + /** + * 线下门店场景 + */ + @SerializedName("biz_store_info") + private BizStoreInfo bizStoreInfo; + /** + * 公众号场景 + */ + @SerializedName("mp_info") + private MpInfo mpInfo; + + /** + * 小程序场景 + */ + @SerializedName("mini_program_info") + private MiniProgramInfo miniProgramInfo; + + /** + * APP场景 + */ + @SerializedName("app_info") + private AppInfo appInfo; + + /** + * 互联网网站场景 + */ + @SerializedName("web_info") + private WebInfo webInfo; + + /** + * 企业微信场景 + */ + @SerializedName("wework_info") + private WeworkInfo weworkInfo; + + /** + * 线下门店场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BizStoreInfo implements Serializable { + private static final long serialVersionUID = 4397253725912709093L; /** - * 入驻结算规则ID + * 门店名称 */ - @SerializedName("settlement_id") - private String settlementId; + @SerializedName("biz_store_name") + private String bizStoreName; /** - * 所属行业 + * 门店省市编码 */ - @SerializedName("qualification_type") - private String qualificationType; + @SerializedName("biz_address_code") + private String bizAddressCode; /** - * 特殊资质图片 + * 门店地址 */ - @SerializedName("qualifications") - private List qualifications; + @SerializedName("biz_store_address") + private String bizStoreAddress; /** - * 优惠费率活动ID + * 门店门头照片 */ - @SerializedName("activities_id") - private String activitiesId; + @SerializedName("store_entrance_pic") + private List storeEntrancePic; /** - * 优惠费率活动值 + * 店内环境照片 */ - @SerializedName("activities_rate") - private String activitiesRate; + @SerializedName("indoor_pic") + private List indoorPic; /** - * 优惠费率活动补充材料 + * 线下场所对应的商家APPID */ - @SerializedName("activities_additions") - private List activitiesAdditions; + @SerializedName("biz_sub_appid") + private String bizSubAppid; - } + } - /** - * 结算银行账户 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class BankAccountInfo implements Serializable { - private static final long serialVersionUID = 1L; + /** + * 公众号场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MpInfo implements Serializable { + private static final long serialVersionUID = 167582552189873597L; + /** + * 服务商公众号APPID + */ + @SerializedName("mp_appid") + private String mpAppid; /** - * 账户类型 + * 商家公众号APPID */ - @SerializedName("bank_account_type") - private BankAccountTypeEnum bankAccountType; + @SerializedName("mp_sub_appid") + private String mpSubAppid; /** - * 开户名称 + * 公众号页面截图 */ - @SerializedName("account_name") - @SpecEncrypt - private String accountName; + @SerializedName("mp_pics") + private List mpPics; + + } + /** + * 小程序场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MiniProgramInfo implements Serializable { + private static final long serialVersionUID = -371749335686796436L; /** - * 开户银行 + * 服务商小程序APPID */ - @SerializedName("account_bank") - private String accountBank; + @SerializedName("mini_program_appid") + private String miniProgramAppid; /** - * 开户银行省市编码 + * 商家小程序APPID */ - @SerializedName("bank_address_code") - private String bankAddressCode; + @SerializedName("mini_program_sub_appid") + private String miniProgramSubAppid; /** - * 开户银行联行号 + * 小程序截图 */ - @SerializedName("bank_branch_id") - private String bankBranchId; + @SerializedName("mini_program_pics") + private List miniProgramPics; + + } + + /** + * APP场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AppInfo implements Serializable { + private static final long serialVersionUID = 3959643687528770473L; /** - * 开户银行全称(含支行] + * 服务商应用APPID */ - @SerializedName("bank_name") - private String bankName; + @SerializedName("app_appid") + private String appAppid; /** - * 银行账号 + * 商家应用APPID */ - @SerializedName("account_number") - @SpecEncrypt - private String accountNumber; + @SerializedName("app_sub_appid") + private String appSubAppid; - } + /** + * APP截图 + */ + @SerializedName("app_pics") + private List appPics; + } - /** - * 补充材料 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class AdditionInfo implements Serializable { - private static final long serialVersionUID = 1L; + /** + * 互联网网站场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class WebInfo implements Serializable { + private static final long serialVersionUID = -4183874827185822310L; + /** + * 互联网网站域名 + */ + @SerializedName("domain") + private String domain; /** - * 法人开户承诺函 + * 网站授权函 */ - @SerializedName("legal_person_commitment") - private String legalPersonCommitment; + @SerializedName("web_authorisation") + private String webAuthorisation; /** - * 法人开户意愿视频 + * 互联网网站对应的商家APPID */ - @SerializedName("legal_person_video") - private String legalPersonVideo; + @SerializedName("web_appid") + private String webAppid; + } + + /** + * 企业微信场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class WeworkInfo implements Serializable { + private static final long serialVersionUID = 9075531305717309383L; /** - * 补充材料 + * 商家企业微信CorpID */ - @SerializedName("business_addition_pics") - private List businessAdditionPics; + @SerializedName("sub_corp_id") + private String subCorpId; /** - * 补充说明 + * 企业微信页面截图 */ - @SerializedName("business_addition_msg") - private String businessAdditionMsg; + @SerializedName("wework_pics") + private List weworkPics; + } } + } + + /** + * 结算规则 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SettlementInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 入驻结算规则ID + */ + @SerializedName("settlement_id") + private String settlementId; + + /** + * 所属行业 + */ + @SerializedName("qualification_type") + private String qualificationType; + + /** + * 特殊资质图片 + */ + @SerializedName("qualifications") + private List qualifications; + + /** + * 优惠费率活动ID + */ + @SerializedName("activities_id") + private String activitiesId; + + /** + * 优惠费率活动值 + */ + @SerializedName("activities_rate") + private String activitiesRate; + + /** + * 优惠费率活动补充材料 + */ + @SerializedName("activities_additions") + private List activitiesAdditions; + + } + + /** + * 结算银行账户 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BankAccountInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 账户类型 + */ + @SerializedName("bank_account_type") + private BankAccountTypeEnum bankAccountType; + + /** + * 开户名称 + */ + @SerializedName("account_name") + @SpecEncrypt + private String accountName; + + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + + /** + * 开户银行省市编码 + */ + @SerializedName("bank_address_code") + private String bankAddressCode; + + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + + /** + * 开户银行全称(含支行] + */ + @SerializedName("bank_name") + private String bankName; + + /** + * 银行账号 + */ + @SerializedName("account_number") + @SpecEncrypt + private String accountNumber; + + } + + + /** + * 补充材料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AdditionInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 法人开户承诺函 + */ + @SerializedName("legal_person_commitment") + private String legalPersonCommitment; + + /** + * 法人开户意愿视频 + */ + @SerializedName("legal_person_video") + private String legalPersonVideo; + + /** + * 补充材料 + */ + @SerializedName("business_addition_pics") + private List businessAdditionPics; + + /** + * 补充说明 + */ + @SerializedName("business_addition_msg") + private String businessAdditionMsg; + + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java index d68ba0ce85..157b8fc093 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java @@ -21,11 +21,11 @@ @AllArgsConstructor @Accessors(chain = true) public class WxPayApplymentCreateResult implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 微信支付申请单号 - */ - @SerializedName("applyment_id") - private String applymentId; + /** + * 微信支付申请单号 + */ + @SerializedName("applyment_id") + private String applymentId; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java index 3239709b6e..15fcba9f96 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java @@ -5,14 +5,14 @@ * 银行结算账户枚举类 */ public enum AccountTypeEnum { - /** - * 对公银行账户 - */ - ACCOUNT_TYPE_BUSINESS, + /** + * 对公银行账户 + */ + ACCOUNT_TYPE_BUSINESS, - /** - * 经营者个人银行卡 - */ - ACCOUNT_TYPE_PRIVATE, - ; + /** + * 经营者个人银行卡 + */ + ACCOUNT_TYPE_PRIVATE, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java index 50affe8772..2997ed522c 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java @@ -6,37 +6,37 @@ * @author zhouyongshen */ public enum ApplymentStateEnum { - /** - * (编辑中):提交申请发生错误导致,请尝试重新提交。 - */ - APPLYMENT_STATE_EDITTING, - /** - * (审核中):申请单正在审核中,超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤。 - */ - APPLYMENT_STATE_AUDITING, - /** - * (已驳回):请按照驳回原因修改申请资料,超级管理员用微信打开“签约链接”,完成绑定微信号,后续申请单进度将通过微信公众号通知超级管理员。 - */ - APPLYMENT_STATE_REJECTED, - /** - * (待账户验证):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成账户验证。 - */ - APPLYMENT_STATE_TO_BE_CONFIRMED, - /** - * (待签约):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成签约。 - */ - APPLYMENT_STATE_TO_BE_SIGNED, - /** - * (开通权限中):系统开通相关权限中,请耐心等待。 - */ - APPLYMENT_STATE_SIGNING, - /** - * (已完成):商户入驻申请已完成。 - */ - APPLYMENT_STATE_FINISHED, - /** - * (已作废):申请单已被撤销。 - */ - APPLYMENT_STATE_CANCELED + /** + * (编辑中):提交申请发生错误导致,请尝试重新提交。 + */ + APPLYMENT_STATE_EDITTING, + /** + * (审核中):申请单正在审核中,超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤。 + */ + APPLYMENT_STATE_AUDITING, + /** + * (已驳回):请按照驳回原因修改申请资料,超级管理员用微信打开“签约链接”,完成绑定微信号,后续申请单进度将通过微信公众号通知超级管理员。 + */ + APPLYMENT_STATE_REJECTED, + /** + * (待账户验证):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成账户验证。 + */ + APPLYMENT_STATE_TO_BE_CONFIRMED, + /** + * (待签约):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成签约。 + */ + APPLYMENT_STATE_TO_BE_SIGNED, + /** + * (开通权限中):系统开通相关权限中,请耐心等待。 + */ + APPLYMENT_STATE_SIGNING, + /** + * (已完成):商户入驻申请已完成。 + */ + APPLYMENT_STATE_FINISHED, + /** + * (已作废):申请单已被撤销。 + */ + APPLYMENT_STATE_CANCELED } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java index 5d566702e7..739ad24474 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java @@ -5,14 +5,14 @@ * 银行结算账户枚举类 */ public enum BankAccountTypeEnum { - /** - * 对公银行账户 - */ - BANK_ACCOUNT_TYPE_CORPORATE, + /** + * 对公银行账户 + */ + BANK_ACCOUNT_TYPE_CORPORATE, - /** - * 经营者个人银行卡 - */ - BANK_ACCOUNT_TYPE_PERSONAL, - ; + /** + * 经营者个人银行卡 + */ + BANK_ACCOUNT_TYPE_PERSONAL, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java index 89ca59d199..f7415fdc3f 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java @@ -4,57 +4,57 @@ * 登记证书的类型枚举 */ public enum CertTypeEnum { - /** - * 事业单位法人证书 - */ - CERTIFICATE_TYPE_2388, - /** - * 统一社会信用代码证书 - */ - CERTIFICATE_TYPE_2389, - /** - * 有偿服务许可证(军队医院适用) - */ - CERTIFICATE_TYPE_2390, - /** - * 医疗机构执业许可证(军队医院适用) - */ - CERTIFICATE_TYPE_2391, - /** - * 企业营业执照(挂靠企业的党组织适用) - */ - CERTIFICATE_TYPE_2392, - /** - * 组织机构代码证(政府机关适用) - */ - CERTIFICATE_TYPE_2393, - /** - * 社会团体法人登记证书 - */ - CERTIFICATE_TYPE_2394, - /** - * 民办非企业单位登记证书 - */ - CERTIFICATE_TYPE_2395, - /** - * 基金会法人登记证书 - */ - CERTIFICATE_TYPE_2396, - /** - * 慈善组织公开募捐资格证书 - */ - CERTIFICATE_TYPE_2397, - /** - * 农民专业合作社法人营业执照 - */ - CERTIFICATE_TYPE_2398, - /** - * 宗教活动场所登记证 - */ - CERTIFICATE_TYPE_2399, - /** - * 其他证书/批文/证明 - */ - CERTIFICATE_TYPE_2400, - ; + /** + * 事业单位法人证书 + */ + CERTIFICATE_TYPE_2388, + /** + * 统一社会信用代码证书 + */ + CERTIFICATE_TYPE_2389, + /** + * 有偿服务许可证(军队医院适用) + */ + CERTIFICATE_TYPE_2390, + /** + * 医疗机构执业许可证(军队医院适用) + */ + CERTIFICATE_TYPE_2391, + /** + * 企业营业执照(挂靠企业的党组织适用) + */ + CERTIFICATE_TYPE_2392, + /** + * 组织机构代码证(政府机关适用) + */ + CERTIFICATE_TYPE_2393, + /** + * 社会团体法人登记证书 + */ + CERTIFICATE_TYPE_2394, + /** + * 民办非企业单位登记证书 + */ + CERTIFICATE_TYPE_2395, + /** + * 基金会法人登记证书 + */ + CERTIFICATE_TYPE_2396, + /** + * 慈善组织公开募捐资格证书 + */ + CERTIFICATE_TYPE_2397, + /** + * 农民专业合作社法人营业执照 + */ + CERTIFICATE_TYPE_2398, + /** + * 宗教活动场所登记证 + */ + CERTIFICATE_TYPE_2399, + /** + * 其他证书/批文/证明 + */ + CERTIFICATE_TYPE_2400, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java index 7bf88e6b56..d65c502b89 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java @@ -5,25 +5,25 @@ * 枚举值 */ public enum IdTypeEnum { - /** - * 中国大陆居民-身份证 - */ - IDENTIFICATION_TYPE_IDCARD, - /** - * 其他国家或地区居民-护照 - */ - IDENTIFICATION_TYPE_OVERSEA_PASSPORT, - /** - * 中国香港居民-来往内地通行证 - */ - IDENTIFICATION_TYPE_HONGKONG_PASSPORT, - /** - * 中国澳门居民-来往内地通行证 - */ - IDENTIFICATION_TYPE_MACAO_PASSPORT, - /** - * 中国台湾居民-来往大陆通行证 - */ - IDENTIFICATION_TYPE_TAIWAN_PASSPORT, - ; + /** + * 中国大陆居民-身份证 + */ + IDENTIFICATION_TYPE_IDCARD, + /** + * 其他国家或地区居民-护照 + */ + IDENTIFICATION_TYPE_OVERSEA_PASSPORT, + /** + * 中国香港居民-来往内地通行证 + */ + IDENTIFICATION_TYPE_HONGKONG_PASSPORT, + /** + * 中国澳门居民-来往内地通行证 + */ + IDENTIFICATION_TYPE_MACAO_PASSPORT, + /** + * 中国台湾居民-来往大陆通行证 + */ + IDENTIFICATION_TYPE_TAIWAN_PASSPORT, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java index baf4d18397..b057dd5740 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java @@ -4,29 +4,29 @@ * 经营场景类型枚举值 */ public enum SalesScenesTypeEnum { - /** - * 线下门店 - */ - SALES_SCENES_STORE, - /** - * 公众号 - */ - SALES_SCENES_MP, - /** - * 小程序 - */ - SALES_SCENES_MINI_PROGRAM, - /** - * 互联网 - */ - SALES_SCENES_WEB, - /** - * APP - */ - SALES_SCENES_APP, - /** - * 企业微信 - */ - SALES_SCENES_WEWORK, - ; + /** + * 线下门店 + */ + SALES_SCENES_STORE, + /** + * 公众号 + */ + SALES_SCENES_MP, + /** + * 小程序 + */ + SALES_SCENES_MINI_PROGRAM, + /** + * 互联网 + */ + SALES_SCENES_WEB, + /** + * APP + */ + SALES_SCENES_APP, + /** + * 企业微信 + */ + SALES_SCENES_WEWORK, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java index f26e6c09f5..ed2fbc719f 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java @@ -6,18 +6,18 @@ * @author zhouyognshen */ public enum SettlementVerifyResultEnum { - /** - * 系统汇款验证中,商户可发起提现尝试。 - */ - VERIFYING, - /** - * 系统成功汇款,该账户可正常发起提现。 - */ - VERIFY_SUCCESS, - /** - * 系统汇款失败,该账户无法发起提现,请检查修改。 - */ - VERIFY_FAIL, - ; + /** + * 系统汇款验证中,商户可发起提现尝试。 + */ + VERIFYING, + /** + * 系统成功汇款,该账户可正常发起提现。 + */ + VERIFY_SUCCESS, + /** + * 系统汇款失败,该账户无法发起提现,请检查修改。 + */ + VERIFY_FAIL, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java index c1555b7c57..7845c052c2 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java @@ -5,24 +5,26 @@ *
  *     商户申请接入时如何选择主体类型? https://kf.qq.com/faq/180910IBZVnQ180910naQ77b.html
  * 
+ * * @author zhouyongshen */ public enum SubjectTypeEnum { - /** - * (个体户):营业执照上的主体类型一般为个体户、个体工商户、个体经营; - */ - SUBJECT_TYPE_INDIVIDUAL, - /** - * (企业):营业执照上的主体类型一般为有限公司、有限责任公司; - */ - SUBJECT_TYPE_ENTERPRISE, - /** - * (党政、机关及事业单位):包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构); - */ - SUBJECT_TYPE_INSTITUTIONS, - /** - * (其他组织):不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。 - */ - SUBJECT_TYPE_OTHERS,; + /** + * (个体户):营业执照上的主体类型一般为个体户、个体工商户、个体经营; + */ + SUBJECT_TYPE_INDIVIDUAL, + /** + * (企业):营业执照上的主体类型一般为有限公司、有限责任公司; + */ + SUBJECT_TYPE_ENTERPRISE, + /** + * (党政、机关及事业单位):包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构); + */ + SUBJECT_TYPE_INSTITUTIONS, + /** + * (其他组织):不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。 + */ + SUBJECT_TYPE_OTHERS, + ; } From 6d996f20b995b269ecb2a9f7d013db9767613b2c Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 23 Aug 2020 17:02:39 +0800 Subject: [PATCH 85/90] =?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=EF=BC=8C=E6=8A=BD?= =?UTF-8?q?=E5=8F=96=E5=85=AC=E5=85=B1=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/common/api/WxConsts.java | 16 ++++++++++++++++ .../cp/api/impl/BaseWxCpServiceImpl.java | 12 ++++-------- .../miniapp/api/impl/BaseWxMaServiceImpl.java | 14 ++++---------- .../wx/miniapp/constant/WxMaConstants.java | 17 ----------------- .../mp/api/impl/BaseWxMpServiceImpl.java | 9 ++------- .../api/impl/WxOpenComponentServiceImpl.java | 18 +++--------------- 6 files changed, 29 insertions(+), 57 deletions(-) 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 2ba0f93213..99acd4f867 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 @@ -1,14 +1,30 @@ package me.chanjar.weixin.common.api; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import static me.chanjar.weixin.common.error.WxMpErrorMsgEnum.*; + /** * 微信开发所使用到的常量类. * * @author Daniel Qian & binarywang */ public class WxConsts { + /** + * access_token 相关错误代码 + *
+   * 发生以下情况时尝试刷新access_token
+   * 40001 获取access_token时AppSecret错误,或者access_token无效
+   * 42001 access_token超时
+   * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口
+   * 
+ */ + public static final List ACCESS_TOKEN_ERROR_CODES = Arrays.asList(CODE_40001.getCode(), + CODE_40014.getCode(), CODE_42001.getCode()); + /** * 微信推送过来的消息的类型,和发送给微信xml格式消息的消息类型. */ 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 f2d96cf5cb..fec21eee71 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java @@ -4,8 +4,9 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.enums.WxType; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.session.StandardSessionManager; @@ -277,13 +278,8 @@ protected T executeInternal(RequestExecutor executor, String uri, E return result; } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - * 40001 获取access_token时AppSecret错误,或者access_token无效 - * 42001 access_token超时 - * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 - */ - if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { + + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { // 强制设置wxCpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token this.configStorage.expireAccessToken(); if (this.getWxCpConfigStorage().autoRefreshToken()) { 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 2b1cb6669a..576174dbf8 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java @@ -10,6 +10,7 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.api.WxImgProcService; import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; @@ -32,8 +33,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; -import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ErrorCode.*; - /** * @author Binary Wang * @see #doGetAccessTokenRequest @@ -169,8 +168,8 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException { /** * 通过网络请求获取AccessToken * - * @return - * @throws IOException + * @return . + * @throws IOException . */ protected abstract String doGetAccessTokenRequest() throws IOException; @@ -244,12 +243,7 @@ private T executeInternal(RequestExecutor executor, String uri, E d return result; } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - */ - if (error.getErrorCode() == ERR_40001 - || error.getErrorCode() == ERR_42001 - || error.getErrorCode() == ERR_40014) { + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { // 强制设置WxMaConfig的access token过期了,这样在下一次请求里就会刷新access token Lock lock = this.getWxMaConfig().getAccessTokenLock(); lock.lock(); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java index 0d2a8675eb..2ca92d084c 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java @@ -53,23 +53,6 @@ public static class KefuMsgType { public static final String MA_PAGE = "miniprogrampage"; } - public static final class ErrorCode { - /** - * 40001 获取access_token时AppSecret错误,或者access_token无效. - */ - public static final int ERR_40001 = 40001; - - /** - * 42001 access_token超时. - */ - public static final int ERR_42001 = 42001; - - /** - * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期). - */ - public static final int ERR_40014 = 40014; - } - /** * 内容安全检测的媒体类型 */ diff --git a/weixin-java-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 ee861e0769..7b8a3a8adc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.api.WxImgProcService; import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; @@ -377,13 +378,7 @@ protected T executeInternal(RequestExecutor executor, String uri, E return result; } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - * 40001 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口 - * 42001 access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明 - * 40014 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 - */ - if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token Lock lock = this.getWxMpConfigStorage().getAccessTokenLock(); lock.lock(); 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 80961921f1..10e5b27869 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java @@ -146,14 +146,8 @@ public String post(String uri, String postData, String accessTokenKey) throws Wx return getWxOpenService().post(uriWithComponentAccessToken, postData); } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - * 40001 获取access_token时AppSecret错误,或者access_token无效 - * 42001 access_token超时 - * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 - */ - if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { - // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { + // 强制设置access token过期,这样在下一次请求里就会刷新access token Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock(); lock.lock(); try { @@ -190,13 +184,7 @@ public String get(String uri, String accessTokenKey) throws WxErrorException { return getWxOpenService().get(uriWithComponentAccessToken, null); } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - * 40001 获取access_token时AppSecret错误,或者access_token无效 - * 42001 access_token超时 - * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 - */ - if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock(); lock.lock(); From b5956fb2982174e856e9fa8d75cb6f4bc7b5849a Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 23 Aug 2020 17:22:35 +0800 Subject: [PATCH 86/90] =?UTF-8?q?:art:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=8E=A5=E5=8F=A3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/WxMpServiceAutoConfiguration.java | 126 ------------------ .../weixin/cp/api/WxCpChatService.java | 10 -- .../chanjar/weixin/cp/api/WxCpOaService.java | 17 --- .../chanjar/weixin/cp/api/WxCpTagService.java | 12 -- .../cp/api/impl/WxCpChatServiceImpl.java | 23 +--- .../weixin/cp/api/impl/WxCpOaServiceImpl.java | 14 -- .../cp/api/impl/WxCpTagServiceImpl.java | 7 - .../cp/bean/oa/WxCpApprovalDataResult.java | 69 ---------- .../cp/bean/oa/WxCpApprovalDetailResult.java | 1 - .../weixin/cp/bean/oa/WxCpApprovalInfo.java | 1 - .../weixin/cp/constant/WxCpApiPathConsts.java | 2 - .../wx/miniapp/api/WxMaMsgService.java | 14 -- .../wx/miniapp/api/WxMaService.java | 7 - .../wx/miniapp/api/WxMaTemplateService.java | 90 ------------- .../miniapp/api/impl/BaseWxMaServiceImpl.java | 13 +- .../miniapp/api/impl/WxMaMsgServiceImpl.java | 12 +- .../api/impl/WxMaTemplateServiceImpl.java | 58 -------- .../wx/miniapp/bean/WxMaTemplateMessage.java | 101 -------------- .../wx/miniapp/config/WxMaConfig.java | 108 ++++++++++++++- .../wx/miniapp/util/json/WxMaGsonBuilder.java | 2 - .../json/WxMaTemplateMessageGsonAdapter.java | 50 ------- .../api/impl/WxMaMsgServiceImplTest.java | 22 --- .../miniapp/bean/WxMaTemplateMessageTest.java | 32 ----- .../wx/miniapp/demo/WxMaDemoServer.java | 20 --- .../me/chanjar/weixin/mp/api/WxMpService.java | 64 --------- .../mp/api/impl/BaseWxMpServiceImpl.java | 20 --- .../wxpay/service/WxPayService.java | 24 ---- .../service/impl/BaseWxPayServiceImpl.java | 21 --- 28 files changed, 113 insertions(+), 827 deletions(-) delete mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDataResult.java delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaTemplateMessageGsonAdapter.java delete mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java index 491d0da584..1c942bbfa2 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java @@ -55,130 +55,4 @@ private WxMpService newWxMpServiceJoddHttpImpl() { return new WxMpServiceJoddHttpImpl(); } - @Bean - @Deprecated - public WxMpKefuService wxMpKefuService(WxMpService wxMpService) { - return wxMpService.getKefuService(); - } - - @Bean - @Deprecated - public WxMpMaterialService wxMpMaterialService(WxMpService wxMpService) { - return wxMpService.getMaterialService(); - } - - @Bean - @Deprecated - public WxMpMenuService wxMpMenuService(WxMpService wxMpService) { - return wxMpService.getMenuService(); - } - - @Bean - @Deprecated - public WxMpUserService wxMpUserService(WxMpService wxMpService) { - return wxMpService.getUserService(); - } - - @Bean - @Deprecated - public WxMpUserTagService wxMpUserTagService(WxMpService wxMpService) { - return wxMpService.getUserTagService(); - } - - @Bean - @Deprecated - public WxMpQrcodeService wxMpQrcodeService(WxMpService wxMpService) { - return wxMpService.getQrcodeService(); - } - - @Bean - @Deprecated - public WxMpCardService wxMpCardService(WxMpService wxMpService) { - return wxMpService.getCardService(); - } - - @Bean - @Deprecated - public WxMpDataCubeService wxMpDataCubeService(WxMpService wxMpService) { - return wxMpService.getDataCubeService(); - } - - @Bean - @Deprecated - public WxMpUserBlacklistService wxMpUserBlacklistService(WxMpService wxMpService) { - return wxMpService.getBlackListService(); - } - - @Bean - @Deprecated - public WxMpStoreService wxMpStoreService(WxMpService wxMpService) { - return wxMpService.getStoreService(); - } - - @Bean - @Deprecated - public WxMpTemplateMsgService wxMpTemplateMsgService(WxMpService wxMpService) { - return wxMpService.getTemplateMsgService(); - } - - @Bean - @Deprecated - public WxMpSubscribeMsgService wxMpSubscribeMsgService(WxMpService wxMpService) { - return wxMpService.getSubscribeMsgService(); - } - - @Bean - @Deprecated - public WxMpDeviceService wxMpDeviceService(WxMpService wxMpService) { - return wxMpService.getDeviceService(); - } - - @Bean - @Deprecated - public WxMpShakeService wxMpShakeService(WxMpService wxMpService) { - return wxMpService.getShakeService(); - } - - @Bean - @Deprecated - public WxMpMemberCardService wxMpMemberCardService(WxMpService wxMpService) { - return wxMpService.getMemberCardService(); - } - - @Bean - @Deprecated - public WxMpMassMessageService wxMpMassMessageService(WxMpService wxMpService) { - return wxMpService.getMassMessageService(); - } - - @Bean - @Deprecated - public WxMpAiOpenService wxMpAiOpenService(WxMpService wxMpService) { - return wxMpService.getAiOpenService(); - } - - @Bean - @Deprecated - public WxMpWifiService wxMpWifiService(WxMpService wxMpService) { - return wxMpService.getWifiService(); - } - - @Bean - @Deprecated - public WxMpMarketingService wxMpMarketingService(WxMpService wxMpService) { - return wxMpService.getMarketingService(); - } - - @Bean - @Deprecated - public WxMpCommentService wxMpCommentService(WxMpService wxMpService) { - return wxMpService.getCommentService(); - } - - @Bean - @Deprecated - public WxOcrService wxMpOcrService(WxMpService wxMpService) { - return wxMpService.getOcrService(); - } - } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpChatService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpChatService.java index 741ee906d5..462ec75071 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpChatService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpChatService.java @@ -12,10 +12,6 @@ * @author gaigeshen */ public interface WxCpChatService { - - @Deprecated - String chatCreate(String name, String owner, List users, String chatId) throws WxErrorException; - /** * 创建群聊会话,注意:刚创建的群,如果没有下发消息,在企业微信不会出现该群. * @@ -28,9 +24,6 @@ public interface WxCpChatService { */ String create(String name, String owner, List users, String chatId) throws WxErrorException; - @Deprecated - void chatUpdate(String chatId, String name, String owner, List usersToAdd, List usersToDelete) throws WxErrorException; - /** * 修改群聊会话. * @@ -43,9 +36,6 @@ public interface WxCpChatService { */ void update(String chatId, String name, String owner, List usersToAdd, List usersToDelete) throws WxErrorException; - @Deprecated - WxCpChat chatGet(String chatId) throws WxErrorException; - /** * 获取群聊会话. * 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 cd8417fcd5..1e9c6dd5e9 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 @@ -110,23 +110,6 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime, */ WxCpApprovalDetailResult getApprovalDetail(@NonNull String spNo) throws WxErrorException; - /** - *
-   *   获取审批数据 (已过期, 请使用"批量获取审批单号" && "获取审批申请详情")
-   *   通过本接口来获取公司一段时间内的审批记录。一次拉取调用最多拉取10000个审批记录,可以通过多次拉取的方式来满足需求,但调用频率不可超过600次/分。
-   *   API doc : https://work.weixin.qq.com/api/doc#90000/90135/91530
-   * 
- * - * @param startTime 获取审批记录的开始时间 - * @param endTime 获取审批记录的结束时间 - * @param nextSpnum 第一个拉取的审批单号,不填从该时间段的第一个审批单拉取 - * @throws WxErrorException . - * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo - * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalDetail - */ - @Deprecated - WxCpApprovalDataResult getApprovalData(Date startTime, Date endTime, Long nextSpnum) throws WxErrorException; - /** * 获取公费电话拨打记录 * diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java index 52bf932303..045264f7d0 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java @@ -17,7 +17,6 @@ * @author Binary Wang */ public interface WxCpTagService { - /** * 创建标签. *
@@ -32,17 +31,6 @@ public interface WxCpTagService {
    */
   String create(String name, Integer id) throws WxErrorException;
 
-  /**
-   * 创建标签.
-   *
-   * @param tagName 标签名
-   * @return 标签id
-   * @throws WxErrorException .
-   * @deprecated 建议使用 {@link #create(String, Integer)},其中后面的参数可以为空
-   */
-  @Deprecated
-  String create(String tagName) throws WxErrorException;
-
   /**
    * 更新标签.
    *
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java
index db85d2f251..10af36afe6 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java
@@ -24,11 +24,10 @@
  */
 @RequiredArgsConstructor
 public class WxCpChatServiceImpl implements WxCpChatService {
-
   private final WxCpService cpService;
 
   @Override
-  public String chatCreate(String name, String owner, List users, String chatId) throws WxErrorException {
+  public String create(String name, String owner, List users, String chatId) throws WxErrorException {
     Map data = new HashMap<>(4);
     if (StringUtils.isNotBlank(name)) {
       data.put("name", name);
@@ -48,12 +47,7 @@ public String chatCreate(String name, String owner, List users, String c
   }
 
   @Override
-  public String create(String name, String owner, List users, String chatId) throws WxErrorException {
-    return this.chatCreate(name, owner, users, chatId);
-  }
-
-  @Override
-  public void chatUpdate(String chatId, String name, String owner, List usersToAdd, List usersToDelete)
+  public void update(String chatId, String name, String owner, List usersToAdd, List usersToDelete)
     throws WxErrorException {
     Map data = new HashMap<>(5);
     if (StringUtils.isNotBlank(chatId)) {
@@ -77,24 +71,13 @@ public void chatUpdate(String chatId, String name, String owner, List us
   }
 
   @Override
-  public void update(String chatId, String name, String owner, List usersToAdd, List usersToDelete)
-    throws WxErrorException {
-    chatUpdate(chatId, name, owner, usersToAdd, usersToDelete);
-  }
-
-  @Override
-  public WxCpChat chatGet(String chatId) throws WxErrorException {
+  public WxCpChat get(String chatId) throws WxErrorException {
     final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_GET_CHATID + chatId);
     String result = this.cpService.get(url, null);
     final String chatInfo = GsonParser.parse(result).getAsJsonObject("chat_info").toString();
     return WxCpGsonBuilder.create().fromJson(chatInfo, WxCpChat.class);
   }
 
-  @Override
-  public WxCpChat get(String chatId) throws WxErrorException {
-    return this.chatGet(chatId);
-  }
-
   @Override
   public void sendMsg(WxCpAppChatMessage message) throws WxErrorException {
     this.cpService.post(this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_SEND), message.toJson());
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
index bdb1e026cf..17a2ba274d 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
@@ -164,20 +164,6 @@ public WxCpApprovalDetailResult getApprovalDetail(@NonNull String spNo) throws W
     return WxCpGsonBuilder.create().fromJson(responseContent, WxCpApprovalDetailResult.class);
   }
 
-  @Override
-  public WxCpApprovalDataResult getApprovalData(Date startTime, Date endTime, Long nextSpnum) throws WxErrorException {
-    JsonObject jsonObject = new JsonObject();
-    jsonObject.addProperty("starttime", startTime.getTime() / 1000L);
-    jsonObject.addProperty("endtime", endTime.getTime() / 1000L);
-    if (nextSpnum != null) {
-      jsonObject.addProperty("next_spnum", nextSpnum);
-    }
-
-    final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_APPROVAL_DATA);
-    String responseContent = this.mainService.post(url, jsonObject.toString());
-    return WxCpGsonBuilder.create().fromJson(responseContent, WxCpApprovalDataResult.class);
-  }
-
   @Override
   public List getDialRecord(Date startTime, Date endTime, Integer offset, Integer limit)
     throws WxErrorException {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java
index 9a507e461f..0e079160fb 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java
@@ -40,13 +40,6 @@ public String create(String name, Integer id) throws WxErrorException {
     return this.create(o);
   }
 
-  @Override
-  public String create(String tagName) throws WxErrorException {
-    JsonObject o = new JsonObject();
-    o.addProperty("tagname", tagName);
-    return this.create(o);
-  }
-
   private String create(JsonObject param) throws WxErrorException {
     String url = this.mainService.getWxCpConfigStorage().getApiUrl(TAG_CREATE);
     String responseContent = this.mainService.post(url, param.toString());
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDataResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDataResult.java
deleted file mode 100644
index b348c97a94..0000000000
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDataResult.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package me.chanjar.weixin.cp.bean.oa;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * 企业微信 OA 审批数据.
- *
- * @author Element
- * @date 2019-04-06 14:36
- */
-@Deprecated
-@Data
-public class WxCpApprovalDataResult implements Serializable {
-  private static final long serialVersionUID = -1046940445840716590L;
-
-  @SerializedName("errcode")
-  private Integer errCode;
-
-  @SerializedName("errmsg")
-  private String errMsg;
-
-  private Integer count;
-
-  private Integer total;
-
-  @SerializedName("next_spnum")
-  private Long nextSpNum;
-
-  private WxCpApprovalData[] data;
-
-
-  @Data
-  public static class WxCpApprovalData implements Serializable {
-    private static final long serialVersionUID = -3051785319608491640L;
-    @SerializedName("spname")
-    private String spName;
-
-    @SerializedName("apply_name")
-    private String applyName;
-
-    @SerializedName("apply_org")
-    private String applyOrg;
-
-    @SerializedName("approval_name")
-    private String[] approvalName;
-
-    @SerializedName("notify_name")
-    private String[] notifyName;
-
-    @SerializedName("sp_status")
-    private Integer spStatus;
-
-    @SerializedName("sp_num")
-    private Long spNum;
-
-    @SerializedName("apply_time")
-    private Long applyTime;
-
-    @SerializedName("apply_user_id")
-    private String applyUserId;
-
-    @SerializedName("comm")
-    private Map comm;
-  }
-}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetailResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetailResult.java
index eb8cd1c1ad..fdbc096a5c 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetailResult.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetailResult.java
@@ -12,7 +12,6 @@
  */
 @Data
 public class WxCpApprovalDetailResult implements Serializable {
-
   private static final long serialVersionUID = 3909779949756252918L;
 
   @SerializedName("errcode")
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalInfo.java
index b12d88baf8..4856af4194 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalInfo.java
@@ -11,7 +11,6 @@
  */
 @Data
 public class WxCpApprovalInfo implements Serializable {
-
   private static final long serialVersionUID = 7387181805254287167L;
 
   @SerializedName("errcode")
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
index eaaf937d08..00e7616d17 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
@@ -68,8 +68,6 @@ public static class Oa {
     public static final String GET_APPROVAL_INFO = "/cgi-bin/oa/getapprovalinfo";
     public static final String GET_APPROVAL_DETAIL = "/cgi-bin/oa/getapprovaldetail";
     public static final String GET_DIAL_RECORD = "/cgi-bin/dial/get_dial_record";
-    @Deprecated
-    public static final String GET_APPROVAL_DATA = "/cgi-bin/corp/getapprovaldata";
     public static final String GET_TEMPLATE_DETAIL = "/cgi-bin/oa/gettemplatedetail";
     public static final String APPLY_EVENT = "/cgi-bin/oa/applyevent";
   }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
index 43c28bb804..f166a2b248 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
@@ -32,20 +32,6 @@ public interface WxMaMsgService {
    */
   boolean sendKefuMsg(WxMaKefuMessage message) throws WxErrorException;
 
-  /**
-   * 
-   * 发送模板消息
-   * 详情请见: 发送模板消息
-   * 接口url格式:https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
-   * 小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能
-   * 
- * - * @param templateMessage 模版消息 - * @throws WxErrorException . - */ - @Deprecated - void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException; - /** *
    * 发送订阅消息
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java
index b6fb72efe7..13862b12fd 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java
@@ -229,13 +229,6 @@ public interface WxMaService extends WxService {
    */
   WxMaQrcodeService getQrcodeService();
 
-  /**
-   * 返回模板配置相关接口方法的实现类对象, 以方便调用其各个接口.
-   *
-   * @return WxMaTemplateService
-   */
-  WxMaTemplateService getTemplateService();
-
   /**
    * 返回订阅消息配置相关接口方法的实现类对象, 以方便调用其各个接口.
    *
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java
deleted file mode 100644
index cbdd3c7585..0000000000
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package cn.binarywang.wx.miniapp.api;
-
-import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
-import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult;
-import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult;
-import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult;
-import me.chanjar.weixin.common.error.WxErrorException;
-
-import java.util.List;
-
-/**
- * @author IOMan(lewis.lynn1006@gmail.com)
- */
-@Deprecated
-public interface WxMaTemplateService {
-  /**
-   * 获取小程序模板库标题列表.
-   */
-  String TEMPLATE_LIBRARY_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list";
-
-  /**
-   * 获取模板库某个模板标题下关键词库.
-   */
-  String TEMPLATE_LIBRARY_KEYWORD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get";
-
-  /**
-   * 组合模板并添加至帐号下的个人模板库.
-   */
-  String TEMPLATE_ADD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add";
-
-  /**
-   * 获取帐号下已存在的模板列表.
-   */
-  String TEMPLATE_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list";
-
-  /**
-   * 删除帐号下的某个模板.
-   */
-  String TEMPLATE_DEL_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/del";
-
-  /**
-   * 
-   * 获取小程序模板库标题列表
-   *
-   * 详情请见: 获取小程序模板库标题列表
-   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?access_token=ACCESS_TOKEN
-   * 
- */ - WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException; - - /** - *
-   * 获取模板库某个模板标题下关键词库
-   *
-   * 详情请见: 获取小程序模板库标题列表
-   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=ACCESS_TOKEN
-   * 
- */ - WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException; - - /** - *
-   * 组合模板并添加至帐号下的个人模板库
-   *
-   * 详情请见: 获取小程序模板库标题列表
-   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=ACCESS_TOKEN
-   * 
- */ - WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException; - - /** - *
-   * 获取帐号下已存在的模板列表
-   *
-   * 详情请见: 获取小程序模板库标题列表
-   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN
-   * 
- */ - WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException; - - /** - *
-   * 删除帐号下的某个模板
-   *
-   * 详情请见: 获取小程序模板库标题列表
-   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN
-   * 
- */ - boolean delTemplate(String templateId) throws WxErrorException; -} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java index 576174dbf8..67a3163f99 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 @@ -40,13 +40,11 @@ @Slf4j public abstract class BaseWxMaServiceImpl implements WxMaService, RequestHttp { private Map configMap; - private WxMaConfig wxMaConfig; private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this); private final WxMaMediaService materialService = new WxMaMediaServiceImpl(this); private final WxMaUserService userService = new WxMaUserServiceImpl(this); private final WxMaQrcodeService qrCodeService = new WxMaQrcodeServiceImpl(this); - private final WxMaTemplateService templateService = new WxMaTemplateServiceImpl(this); private final WxMaAnalysisService analysisService = new WxMaAnalysisServiceImpl(this); private final WxMaCodeService codeService = new WxMaCodeServiceImpl(this); private final WxMaSettingService settingService = new WxMaSettingServiceImpl(this); @@ -275,9 +273,9 @@ private T executeInternal(RequestExecutor executor, String uri, E d /** * 设置当前的AccessToken * - * @param resultContent - * @return - * @throws WxErrorException + * @param resultContent 响应内容 + * @return access token + * @throws WxErrorException 异常 */ protected String extractAccessToken(String resultContent) throws WxErrorException { WxMaConfig config = this.getWxMaConfig(); @@ -399,11 +397,6 @@ public WxMaQrcodeService getQrcodeService() { return this.qrCodeService; } - @Override - public WxMaTemplateService getTemplateService() { - return this.templateService; - } - @Override public WxMaSubscribeService getSubscribeService() { return this.subscribeService; diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java index 3d37d9dbe4..f647a80fee 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java @@ -17,8 +17,7 @@ */ @AllArgsConstructor public class WxMaMsgServiceImpl implements WxMaMsgService { - - private WxMaService wxMaService; + private final WxMaService wxMaService; @Override public boolean sendKefuMsg(WxMaKefuMessage message) throws WxErrorException { @@ -26,15 +25,6 @@ public boolean sendKefuMsg(WxMaKefuMessage message) throws WxErrorException { return responseContent != null; } - @Override - public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException { - String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson()); - JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { - throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); - } - } - @Override public void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException { String responseContent = this.wxMaService.post(SUBSCRIBE_MSG_SEND_URL, subscribeMessage.toJson()); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java deleted file mode 100644 index 9f5fbf0fc1..0000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.binarywang.wx.miniapp.api.impl; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.api.WxMaTemplateService; -import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult; -import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult; -import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult; -import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult; -import com.google.common.collect.ImmutableMap; -import lombok.AllArgsConstructor; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.util.json.WxGsonBuilder; - -import java.util.List; -import java.util.Map; - -/** - * @author Binary - */ -@AllArgsConstructor -public class WxMaTemplateServiceImpl implements WxMaTemplateService { - private WxMaService wxMaService; - - @Override - public WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException { - Map params = ImmutableMap.of("offset", offset, "count", count); - String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_LIST_URL, WxGsonBuilder.create().toJson(params)); - return WxMaTemplateLibraryListResult.fromJson(responseText); - } - - @Override - public WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException { - String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_KEYWORD_URL, - WxGsonBuilder.create().toJson(ImmutableMap.of("id", id))); - return WxMaTemplateLibraryGetResult.fromJson(responseText); - } - - @Override - public WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException { - String responseText = this.wxMaService.post(TEMPLATE_ADD_URL, - WxGsonBuilder.create().toJson(ImmutableMap.of("id", id, "keyword_id_list", keywordIdList.toArray()))); - return WxMaTemplateAddResult.fromJson(responseText); - } - - @Override - public WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException { - Map params = ImmutableMap.of("offset", offset, "count", count); - String responseText = this.wxMaService.post(TEMPLATE_LIST_URL, WxGsonBuilder.create().toJson(params)); - return WxMaTemplateListResult.fromJson(responseText); - } - - @Override - public boolean delTemplate(String templateId) throws WxErrorException { - Map params = ImmutableMap.of("template_id", templateId); - this.wxMaService.post(TEMPLATE_DEL_URL, WxGsonBuilder.create().toJson(params)); - return true; - } -} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java deleted file mode 100644 index 00c7e52f46..0000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java +++ /dev/null @@ -1,101 +0,0 @@ -package cn.binarywang.wx.miniapp.bean; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -/** - * 模板消息. - * 参考 https://developers.weixin.qq.com/miniprogram/dev/api-backend/templateMessage.send.html - * - * @author Binary Wang - */ -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class WxMaTemplateMessage implements Serializable { - private static final long serialVersionUID = 5063374783759519418L; - - /** - * 接收者(用户)的 openid. - *
-   * 参数:touser
-   * 是否必填: 是
-   * 描述: 接收者(用户)的 openid
-   * 
- */ - private String toUser; - - /** - * 所需下发的模板消息的id. - *
-   * 参数:template_id
-   * 是否必填: 是
-   * 描述: 所需下发的模板消息的id
-   * 
- */ - private String templateId; - - /** - * 点击模板卡片后的跳转页面,仅限本小程序内的页面. - *
-   * 参数:page
-   * 是否必填: 否
-   * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
-   * 
- */ - private String page; - - /** - * 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id. - *
-   * 参数:form_id
-   * 是否必填: 是
-   * 描述: 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
-   * 
- */ - private String formId; - - /** - * 模板内容,不填则下发空模板. - *
-   * 参数:data
-   * 是否必填: 是
-   * 描述: 模板内容,不填则下发空模板
-   * 
- */ - private List data; - - /** - * 模板需要放大的关键词,不填则默认无放大. - *
-   * 参数:emphasis_keyword
-   * 是否必填: 否
-   * 描述: 模板需要放大的关键词,不填则默认无放大
-   * 
- */ - private String emphasisKeyword; - - public WxMaTemplateMessage addData(WxMaTemplateData datum) { - if (this.data == null) { - this.data = new ArrayList<>(); - } - this.data.add(datum); - - return this; - } - - public String toJson() { - return WxMaGsonBuilder.create().toJson(this); - } - -} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java index bc381f43af..6854c87e74 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java @@ -12,10 +12,25 @@ */ public interface WxMaConfig { + /** + * Gets access token. + * + * @return the access token + */ String getAccessToken(); + /** + * Gets access token lock. + * + * @return the access token lock + */ Lock getAccessTokenLock(); + /** + * Is access token expired boolean. + * + * @return the boolean + */ boolean isAccessTokenExpired(); /** @@ -38,10 +53,25 @@ public interface WxMaConfig { */ void updateAccessToken(String accessToken, int expiresInSeconds); + /** + * Gets jsapi ticket. + * + * @return the jsapi ticket + */ String getJsapiTicket(); + /** + * Gets jsapi ticket lock. + * + * @return the jsapi ticket lock + */ Lock getJsapiTicketLock(); + /** + * Is jsapi ticket expired boolean. + * + * @return the boolean + */ boolean isJsapiTicketExpired(); /** @@ -59,11 +89,23 @@ public interface WxMaConfig { /** * 卡券api_ticket. + * + * @return the card api ticket */ String getCardApiTicket(); + /** + * Gets card api ticket lock. + * + * @return the card api ticket lock + */ Lock getCardApiTicketLock(); + /** + * Is card api ticket expired boolean. + * + * @return the boolean + */ boolean isCardApiTicketExpired(); /** @@ -74,44 +116,106 @@ public interface WxMaConfig { /** * 应该是线程安全的. * - * @param apiTicket 新的卡券api ticket值 + * @param apiTicket 新的卡券api ticket值 * @param expiresInSeconds 过期时间,以秒为单位 */ void updateCardApiTicket(String apiTicket, int expiresInSeconds); + /** + * Gets appid. + * + * @return the appid + */ String getAppid(); + /** + * Gets secret. + * + * @return the secret + */ String getSecret(); + /** + * Gets token. + * + * @return the token + */ String getToken(); + /** + * Gets aes key. + * + * @return the aes key + */ String getAesKey(); + /** + * Gets original id. + * + * @return the original id + */ String getOriginalId(); + /** + * Gets cloud env. + * + * @return the cloud env + */ String getCloudEnv(); + /** + * Gets msg data format. + * + * @return the msg data format + */ String getMsgDataFormat(); + /** + * Gets expires time. + * + * @return the expires time + */ long getExpiresTime(); + /** + * Gets http proxy host. + * + * @return the http proxy host + */ String getHttpProxyHost(); + /** + * Gets http proxy port. + * + * @return the http proxy port + */ int getHttpProxyPort(); + /** + * Gets http proxy username. + * + * @return the http proxy username + */ String getHttpProxyUsername(); + /** + * Gets http proxy password. + * + * @return the http proxy password + */ String getHttpProxyPassword(); /** * http client builder * - * @return ApacheHttpClientBuilder + * @return ApacheHttpClientBuilder apache http client builder */ ApacheHttpClientBuilder getApacheHttpClientBuilder(); /** * 是否自动刷新token + * + * @return the boolean */ boolean autoRefreshToken(); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java index 5fab9de749..21b582d5bd 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java @@ -1,7 +1,6 @@ package cn.binarywang.wx.miniapp.util.json; import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; import cn.binarywang.wx.miniapp.bean.analysis.WxMaRetainInfo; import cn.binarywang.wx.miniapp.bean.analysis.WxMaUserPortrait; @@ -19,7 +18,6 @@ public class WxMaGsonBuilder { static { INSTANCE.disableHtmlEscaping(); - INSTANCE.registerTypeAdapter(WxMaTemplateMessage.class, new WxMaTemplateMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMaSubscribeMessage.class, new WxMaSubscribeMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMaUniformMessage.class, new WxMaUniformMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMaCodeCommitRequest.class, new WxMaCodeCommitRequestGsonAdapter()); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaTemplateMessageGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaTemplateMessageGsonAdapter.java deleted file mode 100644 index 15eff1ff4d..0000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaTemplateMessageGsonAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.binarywang.wx.miniapp.util.json; - -import java.lang.reflect.Type; - -import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -/** - * @author Binary Wang - */ -public class WxMaTemplateMessageGsonAdapter implements JsonSerializer { - - @Override - public JsonElement serialize(WxMaTemplateMessage message, Type typeOfSrc, JsonSerializationContext context) { - JsonObject messageJson = new JsonObject(); - messageJson.addProperty("touser", message.getToUser()); - messageJson.addProperty("template_id", message.getTemplateId()); - if (message.getPage() != null) { - messageJson.addProperty("page", message.getPage()); - } - - if (message.getFormId() != null) { - messageJson.addProperty("form_id", message.getFormId()); - } - - if (message.getEmphasisKeyword() != null) { - messageJson.addProperty("emphasis_keyword", message.getEmphasisKeyword()); - } - - JsonObject data = new JsonObject(); - messageJson.add("data", data); - - if (message.getData() == null) { - return messageJson; - } - - for (WxMaTemplateData datum : message.getData()) { - JsonObject dataJson = new JsonObject(); - dataJson.addProperty("value", datum.getValue()); - data.add(datum.getName(), dataJson); - } - - return messageJson; - } - -} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java index 554ac1da97..cf127970fd 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java @@ -40,28 +40,6 @@ public void testSendKefuMsg() throws WxErrorException { this.wxService.getMsgService().sendKefuMsg(message); } - @Test(invocationCount = 5, threadPoolSize = 3) - public void testSendTemplateMsg() throws WxErrorException { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); - - WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder() - .toUser(config.getOpenid()) - .formId("FORMID") - .page("index") - .data(Lists.newArrayList( - new WxMaTemplateData("keyword1", "339208499"), - new WxMaTemplateData("keyword2", dateFormat.format(new Date())), - new WxMaTemplateData("keyword3", "粤海喜来登酒店"), - new WxMaTemplateData("keyword4", "广州市天河区天河路208号"))) - .templateId(config.getTemplateId()) - .emphasisKeyword("keyword1.DATA") - .build(); - //templateMessage.addData( new WxMaTemplateData("keyword1", "339208499", "#173177")); - this.wxService.getMsgService().sendTemplateMsg(templateMessage); - } - - @Test public void testSendSubscribeMsg() throws WxErrorException { TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java deleted file mode 100644 index 51eb0e872c..0000000000 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.binarywang.wx.miniapp.bean; - -import org.testng.annotations.*; - -import com.google.common.collect.Lists; - -import static org.testng.AssertJUnit.*; - -/** - * @author Binary Wang - */ -public class WxMaTemplateMessageTest { - @Test - public void testToJson() throws Exception { - WxMaTemplateMessage tm = WxMaTemplateMessage.builder() - .toUser("OPENID") - //.color("aaaaa") - .formId("FORMID") - .page("index") - .data(Lists.newArrayList( - new WxMaTemplateData("keyword1", "339208499", "#173177"), - new WxMaTemplateData("keyword2", "2015年01月05日12:30", "#173177"), - new WxMaTemplateData("keyword3", "粤海喜来登酒店", "#173177"), - new WxMaTemplateData("keyword4", "广州市天河区天河路208号", "#173177"))) - .templateId("TEMPLATE_ID") - .emphasisKeyword("keyword1.DATA") - .build(); - - assertEquals(tm.toJson(), "{\"touser\":\"OPENID\",\"template_id\":\"TEMPLATE_ID\",\"page\":\"index\",\"form_id\":\"FORMID\",\"emphasis_keyword\":\"keyword1.DATA\",\"data\":{\"keyword1\":{\"value\":\"339208499\",\"color\":\"#173177\"},\"keyword2\":{\"value\":\"2015年01月05日12:30\",\"color\":\"#173177\"},\"keyword3\":{\"value\":\"粤海喜来登酒店\",\"color\":\"#173177\"},\"keyword4\":{\"value\":\"广州市天河区天河路208号\",\"color\":\"#173177\"}}}"); - } - -} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java index 89df244413..7784cf3a1d 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java @@ -4,15 +4,12 @@ import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; import cn.binarywang.wx.miniapp.bean.WxMaMessage; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; import cn.binarywang.wx.miniapp.config.WxMaConfig; import cn.binarywang.wx.miniapp.constant.WxMaConstants; import cn.binarywang.wx.miniapp.message.WxMaMessageHandler; import cn.binarywang.wx.miniapp.message.WxMaMessageRouter; import cn.binarywang.wx.miniapp.message.WxMaXmlOutMessage; import cn.binarywang.wx.miniapp.test.TestConfig; -import com.google.common.collect.Lists; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.error.WxErrorException; @@ -97,22 +94,6 @@ public WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map conte } }; - private static final WxMaMessageHandler templateMsgHandler = new WxMaMessageHandler() { - @Override - public WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map context, - WxMaService service, WxSessionManager sessionManager) - throws WxErrorException { - service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder() - .templateId(templateId).data(Lists.newArrayList( - new WxMaTemplateData("keyword1", "339208499", "#173177"))) - .toUser(wxMessage.getFromUser()) - .formId("自己替换可用的formid") - .build()); - return null; - } - - }; - private static final WxMaMessageHandler customerServiceMessageHandler = new WxMaMessageHandler() { @Override public WxMaXmlOutMessage handle(WxMaMessage message, Map context, WxMaService service, WxSessionManager sessionManager) { @@ -157,7 +138,6 @@ private static void init() { router = new WxMaMessageRouter(service); router.rule().handler(logHandler).next() - .rule().async(false).content("模板").handler(templateMsgHandler).end() .rule().async(false).content("文本").handler(textHandler).end() .rule().async(false).content("图片").handler(picHandler).end() .rule().async(false).content("二维码").handler(qrcodeHandler).end() diff --git a/weixin-java-mp/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 e9376368e7..aa7a872f39 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -163,70 +163,6 @@ public interface WxMpService extends WxService { */ String buildQrConnectUrl(String redirectUri, String scope, String state); - /** - *
-   * 构造oauth2授权的url连接.
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息
-   * 
- * - * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode - * @param scope scope - * @param state state - * @return url string - * @deprecated use oauth2Service.buildAuthorizationUrl() instead - */ - @Deprecated - String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state); - - /** - *
-   * 用code换取oauth2的access token.
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息
-   * 
- * - * @param code code - * @return token对象 - * @throws WxErrorException . - */ - @Deprecated - WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException; - - /** - *
-   * 刷新oauth2的access token.
-   * 
- * - * @param refreshToken 刷新token - * @return 新的token对象 - * @throws WxErrorException . - */ - @Deprecated - WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException; - - /** - *
-   * 用oauth2获取用户信息, 当前面引导授权时的scope是snsapi_userinfo的时候才可以.
-   * 
- * - * @param oAuth2AccessToken token对象 - * @param lang zh_CN, zh_TW, en - * @return 用户对象 - * @throws WxErrorException . - */ - @Deprecated - WxMpUser oauth2getUserInfo(WxMpOAuth2AccessToken oAuth2AccessToken, String lang) throws WxErrorException; - - /** - *
-   * 验证oauth2的access token是否有效.
-   * 
- * - * @param oAuth2AccessToken token对象 - * @return 是否有效 - */ - @Deprecated - boolean oauth2validateAccessToken(WxMpOAuth2AccessToken oAuth2AccessToken); - /** *
    * 获取微信服务器IP地址
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
index 7b8a3a8adc..9743114268 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
@@ -243,26 +243,6 @@ private WxMpOAuth2AccessToken getOAuth2AccessToken(String url) throws WxErrorExc
     }
   }
 
-  @Override
-  public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException {
-    return this.oAuth2Service.getAccessToken(code);
-  }
-
-  @Override
-  public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException {
-    return this.oAuth2Service.refreshAccessToken(refreshToken);
-  }
-
-  @Override
-  public WxMpUser oauth2getUserInfo(WxMpOAuth2AccessToken token, String lang) throws WxErrorException {
-      return this.oAuth2Service.getUserInfo(token,lang);
-  }
-
-  @Override
-  public boolean oauth2validateAccessToken(WxMpOAuth2AccessToken token) {
-    return this.oAuth2Service.validateAccessToken(token);
-  }
-
   @Override
   public String[] getCallbackIP() throws WxErrorException {
     String responseContent = this.get(GET_CALLBACK_IP_URL, null);
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 2324fba170..27d86548ca 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
@@ -413,30 +413,6 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
    */
   WxScanPayNotifyResult parseScanPayNotifyResult(String xmlData) throws WxPayException;
 
-  /**
-   * @deprecated 建议使用 {@link RedpackService#sendMiniProgramRedpack(WxPaySendMiniProgramRedpackRequest)}
-   */
-  @Deprecated
-  WxPaySendMiniProgramRedpackResult sendMiniProgramRedpack(WxPaySendMiniProgramRedpackRequest request) throws WxPayException;
-
-  /**
-   * @deprecated 建议使用 {@link RedpackService#sendRedpack(WxPaySendRedpackRequest)}
-   */
-  @Deprecated
-  WxPaySendRedpackResult sendRedpack(WxPaySendRedpackRequest request) throws WxPayException;
-
-  /**
-   * @deprecated 建议使用 {@link RedpackService#queryRedpack(String)}
-   */
-  @Deprecated
-  WxPayRedpackQueryResult queryRedpack(String mchBillNo) throws WxPayException;
-
-  /**
-   * @deprecated 建议使用 {@link RedpackService#queryRedpack(WxPayRedpackQueryRequest)}
-   */
-  @Deprecated
-  WxPayRedpackQueryResult queryRedpack(WxPayRedpackQueryRequest request) throws WxPayException;
-
   /**
    * 
    * 扫码支付模式一生成二维码的方法。
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 3bd514a609..b5012643ca 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
@@ -250,27 +250,6 @@ public WxScanPayNotifyResult parseScanPayNotifyResult(String xmlData) throws WxP
 
   }
 
-  @Override
-  public WxPaySendMiniProgramRedpackResult sendMiniProgramRedpack(WxPaySendMiniProgramRedpackRequest request)
-    throws WxPayException {
-    return this.redpackService.sendMiniProgramRedpack(request);
-  }
-
-  @Override
-  public WxPaySendRedpackResult sendRedpack(WxPaySendRedpackRequest request) throws WxPayException {
-    return this.redpackService.sendRedpack(request);
-  }
-
-  @Override
-  public WxPayRedpackQueryResult queryRedpack(String mchBillNo) throws WxPayException {
-    return this.redpackService.queryRedpack(mchBillNo);
-  }
-
-  @Override
-  public WxPayRedpackQueryResult queryRedpack(WxPayRedpackQueryRequest request) throws WxPayException {
-    return this.redpackService.queryRedpack(request);
-  }
-
   @Override
   public WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxPayException {
     WxPayOrderQueryRequest request = new WxPayOrderQueryRequest();

From 2797bd657ac438e096f6b88dd0ffd0c2fb7b5772 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 23 Aug 2020 23:32:07 +0800
Subject: [PATCH 87/90] =?UTF-8?q?:art:=20=E9=87=8D=E6=9E=84=E9=83=A8?=
 =?UTF-8?q?=E5=88=86=E5=8D=95=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

---
 .../cp/api/impl/WxCpChatServiceImplTest.java       | 14 +++++++-------
 .../WxCpGroupRobotServiceImplTest.java}            |  8 +++++---
 .../weixin/cp/api/impl/WxCpTagServiceImplTest.java |  2 +-
 weixin-java-cp/src/test/resources/testng.xml       |  5 ++---
 4 files changed, 15 insertions(+), 14 deletions(-)
 rename weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/{WxCpGroupRobotServiceTest.java => impl/WxCpGroupRobotServiceImplTest.java} (89%)

diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImplTest.java
index bb4d3904d0..0056b88f77 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImplTest.java
@@ -38,24 +38,24 @@ public void init() {
   }
 
   @Test
-  public void testChatCreate() throws Exception {
-    final String result = cpService.getChatService().chatCreate("测试群聊", userId,
+  public void testCreate() throws Exception {
+    final String result = cpService.getChatService().create("测试群聊", userId,
       Arrays.asList(userId, userId), chatId);
     assertThat(result).isNotEmpty();
     assertThat(result).isEqualTo(chatId);
   }
 
   @Test
-  public void testChatGet() throws Exception {
-    WxCpChat chat = this.cpService.getChatService().chatGet(chatId);
+  public void testGet() throws Exception {
+    WxCpChat chat = this.cpService.getChatService().get(chatId);
     System.out.println(chat);
     Assert.assertEquals(chat.getName(), "测试群聊");
   }
 
   @Test
-  public void testChatUpdate() throws Exception {
-    this.cpService.getChatService().chatUpdate(chatId, "", "", Arrays.asList("ZhengWuYao"), null);
-    WxCpChat chat = this.cpService.getChatService().chatGet(chatId);
+  public void testUpdate() throws Exception {
+    this.cpService.getChatService().update(chatId, "", "", Arrays.asList("ZhengWuYao"), null);
+    WxCpChat chat = this.cpService.getChatService().get(chatId);
     System.out.println(chat);
     Assert.assertEquals(chat.getUsers().size(), 3);
   }
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpGroupRobotServiceTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImplTest.java
similarity index 89%
rename from weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpGroupRobotServiceTest.java
rename to weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImplTest.java
index 126a215b78..b697efd53b 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpGroupRobotServiceTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImplTest.java
@@ -1,9 +1,12 @@
-package me.chanjar.weixin.cp.api;
+package me.chanjar.weixin.cp.api.impl;
 
 import com.google.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.fs.FileUtils;
+import me.chanjar.weixin.cp.api.ApiTestModule;
+import me.chanjar.weixin.cp.api.WxCpGroupRobotService;
+import me.chanjar.weixin.cp.api.WxCpService;
 import me.chanjar.weixin.cp.bean.article.NewArticle;
 import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Guice;
@@ -23,8 +26,7 @@
  */
 @Slf4j
 @Guice(modules = ApiTestModule.class)
-public class WxCpGroupRobotServiceTest {
-
+public class WxCpGroupRobotServiceImplTest {
   @Inject
   protected WxCpService wxService;
 
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImplTest.java
index 8d21bf17f7..7db4564f62 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImplTest.java
@@ -40,7 +40,7 @@ public class WxCpTagServiceImplTest {
 
   @Test
   public void testCreate() throws Exception {
-    this.tagId = this.wxService.getTagService().create("测试标签" + System.currentTimeMillis());
+    this.tagId = this.wxService.getTagService().create("测试标签" + System.currentTimeMillis(), null);
     System.out.println(this.tagId);
   }
 
diff --git a/weixin-java-cp/src/test/resources/testng.xml b/weixin-java-cp/src/test/resources/testng.xml
index 4b94015661..563928bdf0 100644
--- a/weixin-java-cp/src/test/resources/testng.xml
+++ b/weixin-java-cp/src/test/resources/testng.xml
@@ -1,13 +1,12 @@
 
-
-
+
+
   
     
       
       
       
       
-      
     
   
 

From 33b13b1bcddd2541d01d0ad3467e95627f762c22 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 23 Aug 2020 23:52:12 +0800
Subject: [PATCH 88/90] =?UTF-8?q?:art:=20#1591=20=E7=BB=99=E9=83=A8?=
 =?UTF-8?q?=E5=88=86=E8=AF=B7=E6=B1=82=E6=96=B9=E6=B3=95=E5=AF=BC=E8=87=B4?=
 =?UTF-8?q?=E6=97=A0=E9=99=90=E9=80=92=E5=BD=92=E8=B0=83=E7=94=A8=E7=9A=84?=
 =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97=EF=BC=8C?=
 =?UTF-8?q?=E6=96=B9=E4=BE=BF=E6=8E=92=E6=9F=A5=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java    | 1 +
 .../me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java  | 4 +++-
 .../binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java   | 1 +
 .../me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java    | 1 +
 .../weixin/open/api/impl/WxOpenComponentServiceImpl.java      | 2 ++
 5 files changed, 8 insertions(+), 1 deletion(-)

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 fec21eee71..52d88e4564 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
@@ -283,6 +283,7 @@ protected  T executeInternal(RequestExecutor executor, String uri, E
         // 强制设置wxCpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
         this.configStorage.expireAccessToken();
         if (this.getWxCpConfigStorage().autoRefreshToken()) {
+          log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg());
           return this.execute(executor, uri, data);
         }
       }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
index b58672f3a3..191bfec0d8 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
@@ -6,6 +6,7 @@
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.bean.WxAccessToken;
+import me.chanjar.weixin.common.error.WxCpErrorMsgEnum;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.DataUtils;
@@ -222,10 +223,11 @@ protected  T executeInternal(RequestExecutor executor, String uri, E
        * 发生以下情况时尝试刷新suite_access_token
        * 42009 suite_access_token已过期
        */
-      if (error.getErrorCode() == 42009) {
+      if (error.getErrorCode() == WxCpErrorMsgEnum.CODE_42009.getCode()) {
         // 强制设置wxCpTpConfigStorage它的suite access token过期了,这样在下一次请求里就会刷新suite access token
         this.configStorage.expireSuiteAccessToken();
         if (this.getWxCpTpConfigStorage().autoRefreshToken()) {
+          log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg());
           return this.execute(executor, uri, data);
         }
       }
diff --git a/weixin-java-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 67a3163f99..7bd1eec748 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
@@ -255,6 +255,7 @@ private  T executeInternal(RequestExecutor executor, String uri, E d
           lock.unlock();
         }
         if (this.getWxMaConfig().autoRefreshToken()) {
+          log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg());
           return this.execute(executor, uri, data);
         }
       }
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 9743114268..171295a9d8 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
@@ -372,6 +372,7 @@ protected  T executeInternal(RequestExecutor executor, String uri, E
           lock.unlock();
         }
         if (this.getWxMpConfigStorage().autoRefreshToken()) {
+          log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg());
           return this.execute(executor, uri, data);
         }
       }
diff --git a/weixin-java-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 10e5b27869..d460152dfa 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
@@ -161,6 +161,7 @@ public String post(String uri, String postData, String accessTokenKey) throws Wx
         }
 
         if (this.getWxOpenConfigStorage().autoRefreshToken()) {
+          log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg());
           return this.post(uri, postData, accessTokenKey);
         }
       }
@@ -198,6 +199,7 @@ public String get(String uri, String accessTokenKey) throws WxErrorException {
           lock.unlock();
         }
         if (this.getWxOpenConfigStorage().autoRefreshToken()) {
+          log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg());
           return this.get(uri, accessTokenKey);
         }
       }

From daf0b233281b15ad1cd0943620ffdce6fa183f81 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 23 Aug 2020 23:54:15 +0800
Subject: [PATCH 89/90] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?=
 =?UTF-8?q?=E5=88=86=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../api/impl/WxMaTemplateServiceImplTest.java | 69 -------------------
 .../mp/api/impl/BaseWxMpServiceImpl.java      | 16 -----
 .../weixin/mp/demo/DemoOAuth2Handler.java     |  2 +-
 .../weixin/mp/demo/WxMpOAuth2Servlet.java     |  6 +-
 .../open/api/impl/WxOpenMpServiceImpl.java    | 14 ----
 5 files changed, 4 insertions(+), 103 deletions(-)
 delete mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java

diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java
deleted file mode 100644
index 57896685bb..0000000000
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package cn.binarywang.wx.miniapp.api.impl;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
-import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult;
-import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult;
-import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult;
-import cn.binarywang.wx.miniapp.test.ApiTestModule;
-import com.google.inject.Inject;
-import org.assertj.core.util.Lists;
-import org.testng.Assert;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-@Test
-@Guice(modules = ApiTestModule.class)
-public class WxMaTemplateServiceImplTest {
-  @Inject
-  protected WxMaService wxService;
-
-  @Test
-  public void testFindTemplateLibraryList() throws Exception {
-    WxMaTemplateLibraryListResult result = this.wxService.getTemplateService().findTemplateLibraryList(0, 20);
-    Assert.assertEquals(20, result.getList().size());
-  }
-
-  @Test
-  public void testFindTemplateLibraryKeywordList() throws Exception {
-    WxMaTemplateLibraryGetResult result = this.wxService.getTemplateService().findTemplateLibraryKeywordList("AT0004");
-    Assert.assertEquals("AT0004", result.getId());
-    Assert.assertEquals("交易提醒", result.getTitle());
-    Assert.assertEquals(100, result.getKeywordList().size());
-  }
-
-  @Test
-  public void testAddTemplate() throws Exception {
-    List list = Lists.newArrayList();
-    list.add(1);
-    list.add(20);
-    list.add(84);
-
-    WxMaTemplateAddResult result = this.wxService.getTemplateService().addTemplate("AT0004", list);
-    Assert.assertNotNull(result.getTemplateId());
-    System.out.println(result);
-  }
-
-  @Test
-  public void testFindTemplateList() throws Exception {
-    WxMaTemplateListResult result = this.wxService.getTemplateService().findTemplateList(0, 20);
-    System.out.println(result);
-  }
-
-  @Test
-  public void testDelTemplate() throws Exception {
-
-    //add
-    List list = Lists.newArrayList();
-    list.add(1);
-    list.add(20);
-    list.add(84);
-
-    WxMaTemplateAddResult result = this.wxService.getTemplateService().addTemplate("AT0004", list);
-
-    //delete
-    this.wxService.getTemplateService().delTemplate(result.getTemplateId());
-  }
-}
diff --git a/weixin-java-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 171295a9d8..f836cebaa6 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
@@ -221,28 +221,12 @@ public WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) th
     return WxMpSemanticQueryResult.fromJson(responseContent);
   }
 
-  @Override
-  public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) {
-    return String.format(CONNECT_OAUTH2_AUTHORIZE_URL.getUrl(this.getWxMpConfigStorage()),
-      this.getWxMpConfigStorage().getAppId(), URIUtil.encodeURIComponent(redirectURI), scope, StringUtils.trimToEmpty(state));
-  }
-
   @Override
   public String buildQrConnectUrl(String redirectUri, String scope, String state) {
     return String.format(QRCONNECT_URL.getUrl(this.getWxMpConfigStorage()), this.getWxMpConfigStorage().getAppId(),
       URIUtil.encodeURIComponent(redirectUri), scope, StringUtils.trimToEmpty(state));
   }
 
-  private WxMpOAuth2AccessToken getOAuth2AccessToken(String url) throws WxErrorException {
-    try {
-      RequestExecutor executor = SimpleGetRequestExecutor.create(this);
-      String responseText = executor.execute(url, null, WxType.MP);
-      return WxMpOAuth2AccessToken.fromJson(responseText);
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
   @Override
   public String[] getCallbackIP() throws WxErrorException {
     String responseContent = this.get(GET_CALLBACK_IP_URL, null);
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
index 91020c4ece..ce23512e29 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
@@ -17,7 +17,7 @@ public class DemoOAuth2Handler implements WxMpMessageHandler {
   public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
                                   Map context, WxMpService wxMpService,
                                   WxSessionManager sessionManager) {
-    String href = "测试oauth2";
     return WxMpXmlOutMessage.TEXT().content(href)
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
index 4712fb322f..476a56a656 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
@@ -31,15 +31,15 @@ protected void service(HttpServletRequest request, HttpServletResponse response)
       response.getWriter().println("

code

"); response.getWriter().println(code); - WxMpOAuth2AccessToken wxMpOAuth2AccessToken = this.wxMpService.oauth2getAccessToken(code); + WxMpOAuth2AccessToken wxMpOAuth2AccessToken = this.wxMpService.getOAuth2Service().getAccessToken(code); response.getWriter().println("

access token

"); response.getWriter().println(wxMpOAuth2AccessToken.toString()); - WxMpUser wxMpUser = this.wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null); + WxMpUser wxMpUser = this.wxMpService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null); response.getWriter().println("

user info

"); response.getWriter().println(wxMpUser.toString()); - wxMpOAuth2AccessToken = this.wxMpService.oauth2refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken()); + wxMpOAuth2AccessToken = this.wxMpService.getOAuth2Service().refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken()); response.getWriter().println("

after refresh

"); response.getWriter().println(wxMpOAuth2AccessToken.toString()); diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java index aa845fb223..5efa429ade 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java @@ -31,18 +31,4 @@ public String getAccessToken(boolean forceRefresh) throws WxErrorException { return wxOpenComponentService.getAuthorizerAccessToken(appId, forceRefresh); } - @Override - public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException { - return wxOpenComponentService.oauth2getAccessToken(appId, code); - } - - @Override - public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException { - return wxOpenComponentService.oauth2refreshAccessToken(appId, refreshToken); - } - - @Override - public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) { - return wxOpenComponentService.oauth2buildAuthorizationUrl(appId, redirectURI, scope, state); - } } From ec7ab21c4e62a7410190114d5220dd91808c6f73 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 24 Aug 2020 00:14:09 +0800 Subject: [PATCH 90/90] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=203.9.0?= =?UTF-8?q?=20=E6=AD=A3=E5=BC=8F=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-boot-starters/pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-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 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 5b530f15af..13500886e0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.8.9.B + 3.9.0 pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 774540b759..3ec16a2274 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.9.B + 3.9.0 pom wx-java-spring-boot-starters diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index cbc8f5a0db..b6e5904acd 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.9.B + 3.9.0 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 10fecdc1fc..7e59fc8c83 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.9.B + 3.9.0 4.0.0 diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml index 104fdcdd2e..5a98c83a40 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.9.B + 3.9.0 4.0.0 diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index 4a0b52f740..1a93eb54f9 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.8.9.B + 3.9.0 4.0.0 diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml index 946075570b..016544bc6c 100644 --- a/weixin-graal/pom.xml +++ b/weixin-graal/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.9.B + 3.9.0 weixin-graal diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 1703fa47c2..8786e0458d 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.8.9.B + 3.9.0 weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index b23435f4ab..5d9fdae34c 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.9.B + 3.9.0 weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 105d0594d6..16d56b9307 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.9.B + 3.9.0 weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 34bee7fcf8..a89664d469 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.9.B + 3.9.0 weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index f24c81186a..cf743a4042 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.8.9.B + 3.9.0 weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 5bb8953432..a5e0545f42 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.8.9.B + 3.9.0 4.0.0