From b4da5c9fe49e0016afba7895afd1d5c30dc6b5bd Mon Sep 17 00:00:00 2001 From: f00lish Date: Tue, 24 Nov 2020 09:05:07 +0800 Subject: [PATCH 01/12] =?UTF-8?q?:new:=20=20#1885=20=E3=80=90=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E3=80=91=E7=94=B5=E5=95=86=E6=94=B6?= =?UTF-8?q?=E4=BB=98=E9=80=9A=E5=A2=9E=E5=8A=A0=E8=B5=84=E9=87=91=E8=B4=A6?= =?UTF-8?q?=E5=8D=95=E4=B8=8B=E8=BD=BD=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/bean/ecommerce/FundBillRequest.java | 79 ++++++++++ .../wxpay/bean/ecommerce/FundBillResult.java | 139 ++++++++++++++++++ ...BillRequest.java => TradeBillRequest.java} | 4 +- .../{BillResult.java => TradeBillResult.java} | 4 +- ...illTypeEnum.java => FundBillTypeEnum.java} | 11 +- .../wxpay/service/EcommerceService.java | 20 ++- .../service/impl/EcommerceServiceImpl.java | 13 +- .../binarywang/wxpay/v3/util/AesUtils.java | 35 ++++- ...java => WxPayTradeFundBillResultTest.java} | 0 9 files changed, 283 insertions(+), 22 deletions(-) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java rename weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/{BillRequest.java => TradeBillRequest.java} (97%) rename weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/{BillResult.java => TradeBillResult.java} (96%) rename weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/{BillTypeEnum.java => FundBillTypeEnum.java} (64%) rename weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/{WxPayBillResultTest.java => WxPayTradeFundBillResultTest.java} (100%) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java new file mode 100644 index 0000000000..9f12bc3781 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java @@ -0,0 +1,79 @@ +package com.github.binarywang.wxpay.bean.ecommerce; + +import com.google.gson.annotations.SerializedName; +import lombok.*; + +/** + * 资金账单请求 + * @author: f00lish + * @date: 2020/09/28 + */ +@Data +@Builder +@ToString +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class FundBillRequest { + + /** + *
+   * 字段名:账单日期
+   * 变量名:bill_date
+   * 是否必填:是
+   * 类型:string(10)
+   * 描述:
+   *  格式YYYY-MM-DD
+   *  仅支持三个月内的账单下载申请。
+   *  示例值:2019-06-11
+   * 
+ */ + @SerializedName(value = "bill_date") + private String billDate; + + + /** + *
+   * 字段名:资金账户类型
+   * 变量名:account_type
+   * 是否必填:是
+   * 类型:string(32)
+   * 描述:
+   *  枚举值:
+   *  ALL:所有账户
+   *  示例值:ALL
+   * 
+ */ + @SerializedName(value = "account_type") + private String accountType; + + /** + *
+   * 字段名:压缩类型
+   * 变量名:tar_type
+   * 是否必填:否
+   * 类型:string(32)
+   * 描述:
+   *  不填则以不压缩的方式返回数据流
+   *  枚举值:
+   *  GZIP:返回格式为.gzip的压缩包账单
+   *  示例值:GZIP
+   * 
+ */ + @SerializedName(value = "tar_type") + private String tarType; + + /** + *
+   * 字段名:加密算法
+   * 变量名:algorithm
+   * 是否必填:是
+   * 类型:string(32)
+   * 描述:
+   *  枚举值:
+   *  AEAD_AES_256_GCM:AEAD_AES_256_GCM加密算法
+   *  示例值:AEAD_AES_256_GCM
+   * 
+ */ + @SerializedName(value = "algorithm") + private String algorithm; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java new file mode 100644 index 0000000000..de0dcdb890 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java @@ -0,0 +1,139 @@ +package com.github.binarywang.wxpay.bean.ecommerce; + +import com.google.gson.annotations.SerializedName; +import lombok.*; + +/** + * 资金账单结果 + * @author: f00lish + * @date: 2020/09/28 + */ +@Data +@Builder +@ToString +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class FundBillResult { + + /** + *
+   * 字段名:下载信息总数
+   * 变量名:download_bill_count
+   * 是否必填:是
+   * 类型:int
+   * 描述:
+   *  下载信息总数
+   *  示例值:1
+   * 
+ */ + @SerializedName(value = "download_bill_count") + private int downloadBillCount; + + + + /** + *
+   * 字段名:下载信息明细
+   * 变量名:download_bill_list
+   * 是否必填:否
+   * 类型:array
+   * 描述:
+   *  下载信息明细
+   * 
+ */ + @SerializedName(value = "download_bill_list") + private FundBill[] downloadBillList; + + @Data + public static class FundBill { + + /** + *
+     * 字段名:账单文件序号
+     * 变量名:bill_sequence
+     * 是否必填:是
+     * 类型:int
+     * 描述:
+     *  商户将多个文件按账单文件序号的顺序合并为完整的资金账单文件,起始值为1
+     *  示例值:1
+     * 
+ */ + @SerializedName(value = "bill_sequence") + private String billSequence; + + /** + *
+     * 字段名:哈希类型
+     * 变量名:hash_type
+     * 是否必填:是
+     * 类型:string(32)
+     * 描述:
+     *  枚举值:
+     *  SHA1:SHA1值
+     *  示例值:SHA1
+     * 
+ */ + @SerializedName(value = "hash_type") + private String hashType; + + /** + *
+     * 字段名:哈希值
+     * 变量名:hash_value
+     * 是否必填:是
+     * 类型:string(1024)
+     * 描述:
+     *  原始账单(gzip需要解压缩)的摘要值,用于校验文件的完整性。
+     *  示例值:79bb0f45fc4c42234a918000b2668d689e2bde04
+     * 
+ */ + @SerializedName(value = "hash_value") + private String hashValue; + + /** + *
+     * 字段名:账单下载地址
+     * 变量名:download_url
+     * 是否必填:是
+     * 类型:string(2048)
+     * 描述:
+     *  供下一步请求账单文件的下载地址,该地址30s内有效。
+     *  示例值:https://api.mch.weixin.qq.com/v3/billdownload/file?token=xxx
+     * 
+ */ + @SerializedName(value = "download_url") + private String downloadUrl; + + + /** + *
+     * 字段名:加密密钥
+     * 变量名:encrypt_key
+     * 是否必填:是
+     * 类型:string(512)
+     * 描述:
+     *  加密账单文件使用的加密密钥。密钥用商户证书的公钥进行加密,然后进行Base64编码
+     *  示例值:YpkbxSne+mDwyXq//xYPmtr9eQ5LsH7zLMZSs+GSEcY4wjhlsfioS4n9X6q1ZBL0wM1v5qd7KhWuj0rFJ4N1FidP7Q8KDy25QDTt46wiKnsPKSCAXWRFNw1D2JmJBqZsc9y5g0DupONWKYB2GfRigRDEBVszj67uOIILPdxOKX1w3N4jvu0U9IFanJa7ldm70KVvYrMWVgQFDPbgjh1gVDbuTAjmPN88AobLdkiegnBUS2woDZW+PfhPo13kweOiR3h1gXIKRlnKnN3Jkkwpna/AFFijXrFphO3voSuiV0CfptfzTtcae4X3DYG3RSroKqmpa+5tuy2aU2VJUSIuFQ==
+     * 
+ */ + @SerializedName(value = "encrypt_key") + private String encryptKey; + + /** + *
+     * 字段名:随机字符串
+     * 变量名:nonce
+     * 是否必填:是
+     * 类型:string(16)
+     * 描述:
+     *  加密账单文件使用的随机字符串
+     *  示例值:a8607ef79034c49c
+     * 
+ */ + @SerializedName(value = "nonce") + private String nonce; + + + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/BillRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillRequest.java similarity index 97% rename from weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/BillRequest.java rename to weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillRequest.java index 247b2a7d01..ad623edf56 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/BillRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillRequest.java @@ -4,7 +4,7 @@ import lombok.*; /** - * 账单请求 + * 交易账单请求 * @author: f00lish * @date: 2020/09/28 */ @@ -13,7 +13,7 @@ @ToString @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class BillRequest { +public class TradeBillRequest { /** *
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/BillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
similarity index 96%
rename from weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/BillResult.java
rename to weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
index 4a5bdb9524..2fb7b60564 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/BillResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
@@ -4,7 +4,7 @@
 import lombok.*;
 
 /**
- * 账单结果
+ * 交易账单结果
  * @author: f00lish
  * @date: 2020/09/28
  */
@@ -13,7 +13,7 @@
 @ToString
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 @AllArgsConstructor(access = AccessLevel.PRIVATE)
-public class BillResult {
+public class TradeBillResult {
 
   /**
    * 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/BillTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
similarity index 64%
rename from weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/BillTypeEnum.java
rename to weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
index 598ee4be4b..72aff3a02b 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/BillTypeEnum.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
@@ -10,17 +10,16 @@
  */
 @Getter
 @AllArgsConstructor
-public enum BillTypeEnum {
+public enum FundBillTypeEnum {
 
   /**
-   * 交易账单
+   * 资金账单
    */
-  TRADE_BILL("%s/v3/bill/tradebill?%s"),
+  FUND_FLOW_BILL("%s/v3/bill/fundflowbill?%s"),
   /**
-   * 资金账单
+   * 二级商户资金账单
    */
-  FUND_FLOW_BILL("%s/v3/bill/fundflowbill?%s");
-
+  SUB_FUND_FLOW_BILL("%s/v3/ecommerce/bill/fundflowbill?%s");
 
   /**
    * url
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 367f2e8e1e..91c58e7ac3 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
@@ -1,7 +1,7 @@
 package com.github.binarywang.wxpay.service;
 
 import com.github.binarywang.wxpay.bean.ecommerce.*;
-import com.github.binarywang.wxpay.bean.ecommerce.enums.BillTypeEnum;
+import com.github.binarywang.wxpay.bean.ecommerce.enums.FundBillTypeEnum;
 import com.github.binarywang.wxpay.bean.ecommerce.enums.SpAccountTypeEnum;
 import com.github.binarywang.wxpay.bean.ecommerce.enums.TradeTypeEnum;
 import com.github.binarywang.wxpay.exception.WxPayException;
@@ -394,12 +394,24 @@ public interface EcommerceService {
    * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/bill.shtml
    * 
* + * @param request 请求信息。 + * @return 返回数据 return trade bill result + * @throws WxPayException the wx pay exception + */ + TradeBillResult applyBill(TradeBillRequest request) throws WxPayException; + + /** + *
+   * 申请资金账单API
+   * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/bill/chapter3_2.shtml
+   * 
+ * * @param billType 账单类型。 - * @param request 二级商户号。 - * @return 返回数据 return bill result + * @param request 请求信息。 + * @return 返回数据 return fund bill result * @throws WxPayException the wx pay exception */ - BillResult applyBill(BillTypeEnum billType, BillRequest request) throws WxPayException; + FundBillResult applyFundBill(FundBillTypeEnum billType, FundBillRequest request) 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 67976caf31..58a02d8ff8 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
@@ -1,7 +1,7 @@
 package com.github.binarywang.wxpay.service.impl;
 
 import com.github.binarywang.wxpay.bean.ecommerce.*;
-import com.github.binarywang.wxpay.bean.ecommerce.enums.BillTypeEnum;
+import com.github.binarywang.wxpay.bean.ecommerce.enums.FundBillTypeEnum;
 import com.github.binarywang.wxpay.bean.ecommerce.enums.SpAccountTypeEnum;
 import com.github.binarywang.wxpay.bean.ecommerce.enums.TradeTypeEnum;
 import com.github.binarywang.wxpay.exception.WxPayException;
@@ -295,10 +295,17 @@ public SettlementResult querySettlement(String subMchid) throws WxPayException {
   }
 
   @Override
-  public BillResult applyBill(BillTypeEnum billType, BillRequest request) throws WxPayException {
+  public TradeBillResult applyBill(TradeBillRequest request) throws WxPayException {
+    String url = String.format("%s/v3/bill/tradebill?%s", this.payService.getPayBaseUrl(), this.parseURLPair(request));
+    String response = this.payService.getV3(URI.create(url));
+    return GSON.fromJson(response, TradeBillResult.class);
+  }
+
+  @Override
+  public FundBillResult applyFundBill(FundBillTypeEnum billType, FundBillRequest request) throws WxPayException {
     String url = String.format(billType.getUrl(), this.payService.getPayBaseUrl(), this.parseURLPair(request));
     String response = this.payService.getV3(URI.create(url));
-    return GSON.fromJson(response, BillResult.class);
+    return GSON.fromJson(response, FundBillResult.class);
   }
 
   @Override
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 4030965ebe..2c8c40252f 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
@@ -4,6 +4,11 @@
 import com.google.common.io.BaseEncoding;
 import org.apache.commons.lang3.StringUtils;
 
+import javax.crypto.Cipher;
+import javax.crypto.Mac;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
 import java.io.IOException;
 import java.security.GeneralSecurityException;
 import java.security.InvalidAlgorithmParameterException;
@@ -13,11 +18,6 @@
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
-import javax.crypto.Cipher;
-import javax.crypto.Mac;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.spec.GCMParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
 
 public class AesUtils {
 
@@ -32,6 +32,31 @@ public AesUtils(byte[] key) {
     this.aesKey = key;
   }
 
+  public static byte[] decryptToByte(byte[] nonce, byte[] cipherData, byte[] key)
+    throws GeneralSecurityException {
+    return decryptToByte(null, nonce, cipherData, key);
+  }
+
+  public static byte[] decryptToByte(byte[] associatedData, byte[] nonce, byte[] cipherData, byte[] key)
+    throws GeneralSecurityException {
+    try {
+      Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+
+      SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
+      GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);
+
+      cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, spec);
+      if (associatedData != null) {
+        cipher.updateAAD(associatedData);
+      }
+      return cipher.doFinal(cipherData);
+    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
+      throw new IllegalStateException(e);
+    } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
+      throw new IllegalArgumentException(e);
+    }
+  }
+
   public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext)
       throws GeneralSecurityException, IOException {
     try {
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayBillResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayTradeFundBillResultTest.java
similarity index 100%
rename from weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayBillResultTest.java
rename to weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayTradeFundBillResultTest.java

From e6a3e6efcccbe1b295dac4e283c46dc48cbdbf3b Mon Sep 17 00:00:00 2001
From: yangyh22 <9944784+yangyh22@users.noreply.github.com>
Date: Tue, 24 Nov 2020 09:51:00 +0800
Subject: [PATCH 02/12] =?UTF-8?q?:new:=20#1866=20=E3=80=90=E5=B0=8F?=
 =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=20=E5=A2=9E=E5=8A=A0=E6=8F=90?=
 =?UTF-8?q?=E5=AE=A1=E7=B4=A0=E6=9D=90=E4=B8=8A=E4=BC=A0=E6=8E=A5=E5=8F=A3?=
 =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=89=A7=E8=A1=8C=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../bean/result/WxAuditMediaUploadResult.java | 31 ++++++++++
 .../http/AuditMediaUploadRequestExecutor.java | 47 +++++++++++++++
 ...ApacheAuditMediaUploadRequestExecutor.java | 58 +++++++++++++++++++
 ...ddHttpAuditMediaUploadRequestExecutor.java | 46 +++++++++++++++
 ...OkHttpAuditMediaUploadRequestExecutor.java | 49 ++++++++++++++++
 5 files changed, 231 insertions(+)
 create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxAuditMediaUploadResult.java
 create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/AuditMediaUploadRequestExecutor.java
 create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheAuditMediaUploadRequestExecutor.java
 create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpAuditMediaUploadRequestExecutor.java
 create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpAuditMediaUploadRequestExecutor.java

diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxAuditMediaUploadResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxAuditMediaUploadResult.java
new file mode 100644
index 0000000000..916fe1815e
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxAuditMediaUploadResult.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.common.bean.result;
+
+import java.io.Serializable;
+
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+/**
+ * 小程序 提审素材上传接口
+ *
+ * @author yangyh22
+ * @since 2020/11/14
+ */
+@Data
+public class WxAuditMediaUploadResult implements Serializable {
+
+  private static final long serialVersionUID = 1L;
+
+  private String type;
+  private String mediaid;
+
+  public static WxAuditMediaUploadResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxAuditMediaUploadResult.class);
+  }
+
+  @Override
+  public String toString() {
+    return WxGsonBuilder.create().toJson(this);
+  }
+
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/AuditMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/AuditMediaUploadRequestExecutor.java
new file mode 100644
index 0000000000..aeb6894e0f
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/AuditMediaUploadRequestExecutor.java
@@ -0,0 +1,47 @@
+package me.chanjar.weixin.common.util.http;
+
+import java.io.File;
+import java.io.IOException;
+
+import me.chanjar.weixin.common.bean.result.WxAuditMediaUploadResult;
+import me.chanjar.weixin.common.enums.WxType;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.apache.ApacheAuditMediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.jodd.JoddHttpAuditMediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.okhttp.OkHttpAuditMediaUploadRequestExecutor;
+
+/**
+ * 小程序 提审素材上传接口
+ * 上传媒体文件请求执行器.
+ * 请求的参数是File, 返回的结果是String
+ *
+ * @author yangyh22
+ * @since 2020/11/14
+ */
+public abstract class AuditMediaUploadRequestExecutor implements RequestExecutor {
+
+  protected RequestHttp requestHttp;
+
+  public AuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
+    this.requestHttp = requestHttp;
+  }
+
+  @Override
+  public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
+  }
+
+  public static RequestExecutor create(RequestHttp requestHttp) {
+    switch (requestHttp.getRequestType()) {
+      case APACHE_HTTP:
+        return new ApacheAuditMediaUploadRequestExecutor(requestHttp);
+      case JODD_HTTP:
+        return new JoddHttpAuditMediaUploadRequestExecutor(requestHttp);
+      case OK_HTTP:
+        return new OkHttpAuditMediaUploadRequestExecutor(requestHttp);
+      default:
+        return null;
+    }
+  }
+
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheAuditMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheAuditMediaUploadRequestExecutor.java
new file mode 100644
index 0000000000..a390b9f9db
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheAuditMediaUploadRequestExecutor.java
@@ -0,0 +1,58 @@
+package me.chanjar.weixin.common.util.http.apache;
+
+import java.io.File;
+import java.io.IOException;
+
+import me.chanjar.weixin.common.bean.result.WxAuditMediaUploadResult;
+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.AuditMediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+/**
+ * @author yangyh22
+ * @since 2020/11/14
+ */
+public class ApacheAuditMediaUploadRequestExecutor extends AuditMediaUploadRequestExecutor {
+
+  public ApacheAuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
+    super(requestHttp);
+  }
+
+  @Override
+  public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+    HttpPost httpPost = new HttpPost(uri);
+    if (requestHttp.getRequestHttpProxy() != null) {
+      RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
+      httpPost.setConfig(config);
+    }
+    if (file != null) {
+      HttpEntity entity = MultipartEntityBuilder
+        .create()
+        .addBinaryBody("media", file)
+        .setMode(HttpMultipartMode.RFC6532)
+        .build();
+      httpPost.setEntity(entity);
+    }
+    try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
+      String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
+      WxError error = WxError.fromJson(responseContent, wxType);
+      if (error.getErrorCode() != 0) {
+        throw new WxErrorException(error);
+      }
+      return WxAuditMediaUploadResult.fromJson(responseContent);
+    } finally {
+      httpPost.releaseConnection();
+    }
+  }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpAuditMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpAuditMediaUploadRequestExecutor.java
new file mode 100644
index 0000000000..4747dc8438
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpAuditMediaUploadRequestExecutor.java
@@ -0,0 +1,46 @@
+package me.chanjar.weixin.common.util.http.jodd;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.HttpResponse;
+import jodd.http.ProxyInfo;
+import me.chanjar.weixin.common.bean.result.WxAuditMediaUploadResult;
+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.AuditMediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+
+/**
+ * @author yangyh22
+ * @since 2020/11/14
+ */
+public class JoddHttpAuditMediaUploadRequestExecutor extends AuditMediaUploadRequestExecutor {
+
+  public JoddHttpAuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
+    super(requestHttp);
+  }
+
+  @Override
+  public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+    HttpRequest request = HttpRequest.post(uri);
+    if (requestHttp.getRequestHttpProxy() != null) {
+      requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
+    }
+    request.withConnectionProvider(requestHttp.getRequestHttpClient());
+    request.form("media", file);
+    HttpResponse response = request.send();
+    response.charset(StandardCharsets.UTF_8.name());
+
+    String responseContent = response.bodyText();
+    WxError error = WxError.fromJson(responseContent, wxType);
+    if (error.getErrorCode() != 0) {
+      throw new WxErrorException(error);
+    }
+    return WxAuditMediaUploadResult.fromJson(responseContent);
+  }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpAuditMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpAuditMediaUploadRequestExecutor.java
new file mode 100644
index 0000000000..78f4c4af0f
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpAuditMediaUploadRequestExecutor.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.common.util.http.okhttp;
+
+import java.io.File;
+import java.io.IOException;
+
+import me.chanjar.weixin.common.bean.result.WxAuditMediaUploadResult;
+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.AuditMediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+/**
+ * @author yangyh22
+ * @since 2020/11/14
+ */
+public class OkHttpAuditMediaUploadRequestExecutor extends AuditMediaUploadRequestExecutor {
+
+  public OkHttpAuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
+    super(requestHttp);
+  }
+
+  @Override
+  public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+
+    RequestBody body = new MultipartBody.Builder()
+      .setType(MediaType.parse("multipart/form-data"))
+      .addFormDataPart("media",
+        file.getName(),
+        RequestBody.create(MediaType.parse("application/octet-stream"), file))
+      .build();
+    Request request = new Request.Builder().url(uri).post(body).build();
+
+    Response response = requestHttp.getRequestHttpClient().newCall(request).execute();
+    String responseContent = response.body().string();
+    WxError error = WxError.fromJson(responseContent, wxType);
+    if (error.getErrorCode() != 0) {
+      throw new WxErrorException(error);
+    }
+    return WxAuditMediaUploadResult.fromJson(responseContent);
+  }
+
+}

From ff064c8663dd0d0cf4a79e88794ca388e8b6259d Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Tue, 24 Nov 2020 09:59:32 +0800
Subject: [PATCH 03/12] =?UTF-8?q?:art:=20=E9=87=8D=E6=9E=84=E8=A7=84?=
 =?UTF-8?q?=E8=8C=83=E5=B0=8F=E7=A8=8B=E5=BA=8F=E9=83=A8=E5=88=86=E4=BB=A3?=
 =?UTF-8?q?=E7=A0=81=E5=8C=85=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../api/impl/WxMaAnalysisServiceImpl.java      |  2 +-
 .../miniapp/api/impl/WxMaCloudServiceImpl.java |  2 +-
 .../miniapp/api/impl/WxMaCodeServiceImpl.java  |  2 +-
 .../api/impl/WxMaExpressServiceImpl.java       |  2 +-
 .../api/impl/WxMaLiveGoodsServiceImpl.java     |  2 +-
 .../miniapp/api/impl/WxMaLiveServiceImpl.java  |  2 +-
 .../miniapp/api/impl/WxMaMsgServiceImpl.java   |  2 +-
 .../api/impl/WxMaPluginServiceImpl.java        |  2 +-
 .../api/impl/WxMaQrcodeServiceImpl.java        |  6 +++---
 .../api/impl/WxMaSettingServiceImpl.java       |  2 +-
 .../api/impl/WxMaSubscribeServiceImpl.java     |  2 +-
 .../bean/AbstractWxMaQrcodeWrapper.java        |  2 +-
 .../bean/WxMaAuditMediaUploadResult.java       | 18 ++++++++++--------
 .../wx/miniapp/bean/WxMaDomainAction.java      |  2 +-
 .../miniapp/bean/WxMaJscode2SessionResult.java |  2 +-
 .../wx/miniapp/bean/WxMaKefuMessage.java       |  2 +-
 .../bean/WxMaMediaAsyncCheckResult.java        |  2 +-
 .../wx/miniapp/bean/WxMaMessage.java           |  2 +-
 .../wx/miniapp/bean/WxMaPhoneNumberInfo.java   |  2 +-
 .../binarywang/wx/miniapp/bean/WxMaQrcode.java |  2 +-
 .../wx/miniapp/bean/WxMaRunStepInfo.java       |  2 +-
 .../wx/miniapp/bean/WxMaShareInfo.java         |  2 +-
 .../wx/miniapp/bean/WxMaSubscribeMessage.java  |  2 +-
 .../wx/miniapp/bean/WxMaUniformMessage.java    |  5 +++--
 .../wx/miniapp/bean/WxMaUserInfo.java          |  2 +-
 .../cn/binarywang/wx/miniapp/bean/WxaCode.java |  2 +-
 .../wx/miniapp/bean/WxaCodeUnlimit.java        |  2 +-
 .../miniapp/bean/analysis/WxMaRetainInfo.java  |  2 +-
 .../bean/analysis/WxMaUserPortrait.java        |  2 +-
 .../bean/analysis/WxMaVisitDistribution.java   |  2 +-
 .../miniapp/bean/code/WxMaCodeAuditStatus.java |  2 +-
 .../bean/code/WxMaCodeCommitRequest.java       |  2 +-
 .../bean/code/WxMaCodeSubmitAuditRequest.java  |  2 +-
 .../bean/code/WxMaCodeVersionDistribution.java |  2 +-
 .../bean/express/WxMaExpressAccount.java       |  2 +-
 .../bean/express/WxMaExpressDelivery.java      |  2 +-
 .../miniapp/bean/express/WxMaExpressPath.java  |  2 +-
 .../bean/express/WxMaExpressPrinter.java       |  2 +-
 .../request/WxMaExpressAddOrderRequest.java    |  2 +-
 .../request/WxMaExpressBindAccountRequest.java |  2 +-
 .../request/WxMaExpressGetOrderRequest.java    |  2 +-
 .../WxMaExpressPrinterUpdateRequest.java       |  2 +-
 .../WxMaExpressTestUpdateOrderRequest.java     |  2 +-
 .../result/WxMaExpressOrderInfoResult.java     |  2 +-
 .../miniapp/bean/live/WxMaAssistantResult.java |  2 +-
 .../wx/miniapp/bean/live/WxMaLiveResult.java   |  2 +-
 .../config/impl/WxMaDefaultConfigImpl.java     |  2 +-
 .../ApacheAuditMediaUploadRequestExecutor.java | 10 +++++-----
 .../AuditMediaUploadRequestExecutor.java       | 16 ++++++++--------
 ...oddHttpAuditMediaUploadRequestExecutor.java |  9 ++++-----
 .../OkHttpAuditMediaUploadRequestExecutor.java | 10 +++++-----
 .../QrcodeBytesRequestExecutor.java            |  2 +-
 .../QrcodeFileRequestExecutor.java             |  2 +-
 .../QrcodeRequestExecutor.java                 |  2 +-
 .../{util => }/json/WxMaGsonBuilder.java       |  3 ++-
 .../WxMaCodeCommitRequestGsonAdapter.java      |  3 ++-
 ...WxMaCodeVersionDistributionGsonAdapter.java |  2 +-
 .../adaptor}/WxMaRetainInfoGsonAdapter.java    |  2 +-
 .../WxMaSubscribeMessageGsonAdapter.java       |  2 +-
 .../WxMaUniformMessageGsonAdapter.java         |  2 +-
 .../adaptor}/WxMaUserPortraitGsonAdapter.java  |  2 +-
 .../WxMaVisitDistributionGsonAdapter.java      |  2 +-
 .../api/impl/WxMaExpressServiceImplTest.java   |  2 +-
 .../WxMaUniformMessageGsonAdapterTest.java     |  2 +-
 .../open/api/impl/WxOpenMaServiceImpl.java     |  2 +-
 .../wxpay/service/impl/EntPayServiceImpl.java  | 13 +++----------
 ...esultTest.java => WxPayBillResultTest.java} |  0
 67 files changed, 101 insertions(+), 104 deletions(-)
 rename weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxAuditMediaUploadResult.java => weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaAuditMediaUploadResult.java (51%)
 rename {weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache => weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor}/ApacheAuditMediaUploadRequestExecutor.java (82%)
 rename {weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http => weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor}/AuditMediaUploadRequestExecutor.java (59%)
 rename {weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd => weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor}/JoddHttpAuditMediaUploadRequestExecutor.java (77%)
 rename {weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp => weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor}/OkHttpAuditMediaUploadRequestExecutor.java (77%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util => executor}/QrcodeBytesRequestExecutor.java (98%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util => executor}/QrcodeFileRequestExecutor.java (98%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util => executor}/QrcodeRequestExecutor.java (98%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util => }/json/WxMaGsonBuilder.java (94%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util/json => json/adaptor}/WxMaCodeCommitRequestGsonAdapter.java (90%)
 mode change 100755 => 100644
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util/json => json/adaptor}/WxMaCodeVersionDistributionGsonAdapter.java (97%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util/json => json/adaptor}/WxMaRetainInfoGsonAdapter.java (97%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util/json => json/adaptor}/WxMaSubscribeMessageGsonAdapter.java (96%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util/json => json/adaptor}/WxMaUniformMessageGsonAdapter.java (98%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util/json => json/adaptor}/WxMaUserPortraitGsonAdapter.java (98%)
 rename weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/{util/json => json/adaptor}/WxMaVisitDistributionGsonAdapter.java (97%)
 rename weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/{util => }/json/WxMaUniformMessageGsonAdapterTest.java (98%)
 rename weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/{WxPayTradeFundBillResultTest.java => WxPayBillResultTest.java} (100%)

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 db69642714..b0f1606593 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
@@ -8,7 +8,7 @@
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitDistribution;
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitPage;
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitTrend;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
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 300ded88fe..c4058e1523 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
@@ -5,7 +5,7 @@
 import cn.binarywang.wx.miniapp.bean.cloud.*;
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
 import cn.binarywang.wx.miniapp.util.JoinerUtils;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.gson.JsonArray;
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 2d965b4c45..4d73f6aa16 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
@@ -19,7 +19,7 @@
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeCommitRequest;
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeSubmitAuditRequest;
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeVersionDistribution;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import me.chanjar.weixin.common.error.WxError;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImpl.java
index 21d0bfe0b0..ab2d23c9dc 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImpl.java
@@ -8,7 +8,7 @@
 import cn.binarywang.wx.miniapp.bean.express.WxMaExpressPrinter;
 import cn.binarywang.wx.miniapp.bean.express.request.*;
 import cn.binarywang.wx.miniapp.bean.express.result.WxMaExpressOrderInfoResult;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
 
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 ba776a8f5d..a3ff950c21 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
@@ -4,7 +4,7 @@
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.live.WxMaLiveGoodInfo;
 import cn.binarywang.wx.miniapp.bean.live.WxMaLiveResult;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.gson.JsonArray;
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 e3af028253..cc3b266dc7 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,7 +6,7 @@
 import cn.binarywang.wx.miniapp.bean.live.WxMaLiveAssistantInfo;
 import cn.binarywang.wx.miniapp.bean.live.WxMaLiveResult;
 import cn.binarywang.wx.miniapp.bean.live.WxMaLiveRoomInfo;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.common.base.Joiner;
 import com.google.gson.JsonObject;
 import lombok.AllArgsConstructor;
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 f647a80fee..776a17a251 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
@@ -4,7 +4,7 @@
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.*;
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.enums.WxType;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java
index 134ed66d51..643b3e0592 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java
@@ -3,7 +3,7 @@
 import cn.binarywang.wx.miniapp.api.WxMaPluginService;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaPluginListResult;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.common.collect.ImmutableMap;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaQrcodeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaQrcodeServiceImpl.java
index dbd8fa3e51..524be9fe92 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaQrcodeServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaQrcodeServiceImpl.java
@@ -6,9 +6,9 @@
 import cn.binarywang.wx.miniapp.bean.WxMaQrcode;
 import cn.binarywang.wx.miniapp.bean.WxaCode;
 import cn.binarywang.wx.miniapp.bean.WxaCodeUnlimit;
-import cn.binarywang.wx.miniapp.util.QrcodeBytesRequestExecutor;
-import cn.binarywang.wx.miniapp.util.QrcodeFileRequestExecutor;
-import cn.binarywang.wx.miniapp.util.QrcodeRequestExecutor;
+import cn.binarywang.wx.miniapp.executor.QrcodeBytesRequestExecutor;
+import cn.binarywang.wx.miniapp.executor.QrcodeFileRequestExecutor;
+import cn.binarywang.wx.miniapp.executor.QrcodeRequestExecutor;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSettingServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSettingServiceImpl.java
index c69a58d1b1..3980f145fc 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSettingServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSettingServiceImpl.java
@@ -3,7 +3,7 @@
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.WxMaSettingService;
 import cn.binarywang.wx.miniapp.bean.WxMaDomainAction;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
 
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 8682612a9b..faa88a6387 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
@@ -3,7 +3,7 @@
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.WxMaSubscribeService;
 import cn.binarywang.wx.miniapp.bean.template.WxMaPubTemplateTitleListResult;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.gson.reflect.TypeToken;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/AbstractWxMaQrcodeWrapper.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/AbstractWxMaQrcodeWrapper.java
index cb444c94c1..c7fbe10666 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/AbstractWxMaQrcodeWrapper.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/AbstractWxMaQrcodeWrapper.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 
 /**
  * 微信二维码(小程序码)包装器.
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxAuditMediaUploadResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaAuditMediaUploadResult.java
similarity index 51%
rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxAuditMediaUploadResult.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaAuditMediaUploadResult.java
index 916fe1815e..6468662528 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxAuditMediaUploadResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaAuditMediaUploadResult.java
@@ -1,10 +1,11 @@
-package me.chanjar.weixin.common.bean.result;
-
-import java.io.Serializable;
+package cn.binarywang.wx.miniapp.bean;
 
+import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
+import java.io.Serializable;
+
 /**
  * 小程序 提审素材上传接口
  *
@@ -12,15 +13,16 @@
  * @since 2020/11/14
  */
 @Data
-public class WxAuditMediaUploadResult implements Serializable {
-
+public class WxMaAuditMediaUploadResult implements Serializable {
   private static final long serialVersionUID = 1L;
 
   private String type;
-  private String mediaid;
 
-  public static WxAuditMediaUploadResult fromJson(String json) {
-    return WxGsonBuilder.create().fromJson(json, WxAuditMediaUploadResult.class);
+  @SerializedName("mediaid")
+  private String mediaId;
+
+  public static WxMaAuditMediaUploadResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxMaAuditMediaUploadResult.class);
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaDomainAction.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaDomainAction.java
index 19a6a1cde9..b41782597f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaDomainAction.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaDomainAction.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaJscode2SessionResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaJscode2SessionResult.java
index 85b4767702..af113e4ec5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaJscode2SessionResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaJscode2SessionResult.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessage.java
index 73ca435d62..5d16b60b75 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessage.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessage.java
@@ -4,7 +4,7 @@
 import cn.binarywang.wx.miniapp.builder.LinkMessageBuilder;
 import cn.binarywang.wx.miniapp.builder.MaPageMessageBuilder;
 import cn.binarywang.wx.miniapp.builder.TextMessageBuilder;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
index e7fda61a02..f4428b959b 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java
index 08a2e5794c..57d6a5b9be 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java
@@ -2,7 +2,7 @@
 
 import cn.binarywang.wx.miniapp.config.WxMaConfig;
 import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import cn.binarywang.wx.miniapp.util.xml.XStreamTransformer;
 import com.google.gson.annotations.SerializedName;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
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 149ecbebe8..da481f0983 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
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.Data;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaQrcode.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaQrcode.java
index 5c17cd1e58..cb505a1654 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaQrcode.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaQrcode.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
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 5e6ff641c4..fe9e74b3fc 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
@@ -3,7 +3,7 @@
 import java.io.Serializable;
 import java.util.List;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaShareInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaShareInfo.java
index 91aff519c0..e8c7f1a9ae 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaShareInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaShareInfo.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.Data;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java
index 74f3f6a61c..edf4dc3c3a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java
@@ -1,7 +1,7 @@
 package cn.binarywang.wx.miniapp.bean;
 
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.*;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaUniformMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaUniformMessage.java
index 4cb4c86971..6df12b1b86 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaUniformMessage.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaUniformMessage.java
@@ -4,7 +4,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.adaptor.WxMaUniformMessageGsonAdapter;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -99,7 +100,7 @@ public static class MiniProgram implements Serializable {
     private String appid;
     /**
      *  注意,此属性不是最终的json字符串,可结合以下两个属性一起使用,确定最终json字符串是什么
-     *  转换的代码逻辑,请阅读 {@link cn.binarywang.wx.miniapp.util.json.WxMaUniformMessageGsonAdapter}
+     *  转换的代码逻辑,请阅读 {@link WxMaUniformMessageGsonAdapter}
      */
     private String pagePath;
 
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 368fa772cc..86b14f7555 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
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.Data;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxaCode.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxaCode.java
index 2d94f05cea..2361355adf 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxaCode.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxaCode.java
@@ -2,7 +2,7 @@
 
 import java.io.Serializable;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxaCodeUnlimit.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxaCodeUnlimit.java
index 05bf134c6b..ab0dad4e2b 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxaCodeUnlimit.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxaCodeUnlimit.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaRetainInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaRetainInfo.java
index 7021a180e9..8006cca01d 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaRetainInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaRetainInfo.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.analysis;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaUserPortrait.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaUserPortrait.java
index 5e1164909e..0dcf30ee38 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaUserPortrait.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaUserPortrait.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.analysis;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.Data;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaVisitDistribution.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaVisitDistribution.java
index 1655eec286..84a8ac1220 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaVisitDistribution.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/analysis/WxMaVisitDistribution.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.analysis;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeAuditStatus.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeAuditStatus.java
index 3faa18660b..d8733756c1 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeAuditStatus.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeAuditStatus.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.code;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeCommitRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeCommitRequest.java
index f59fb1f039..788f166413 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeCommitRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeCommitRequest.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.code;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeSubmitAuditRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeSubmitAuditRequest.java
index b65c4df588..ff245c8e6a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeSubmitAuditRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeSubmitAuditRequest.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.code;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeVersionDistribution.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeVersionDistribution.java
index dd0a03a918..9a57933d75 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeVersionDistribution.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeVersionDistribution.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.code;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
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 950bda3066..d783c29acf 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
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
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 dbdb02c113..7a5465ee38 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
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPath.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPath.java
index bbd3feacdb..28c0bcdfc2 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPath.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPath.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Data;
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 b41d33305c..2c1e98602a 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,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressAddOrderRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressAddOrderRequest.java
index e11f5beb6e..01056753f7 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressAddOrderRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressAddOrderRequest.java
@@ -2,7 +2,7 @@
 
 
 import cn.binarywang.wx.miniapp.bean.express.*;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressBindAccountRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressBindAccountRequest.java
index be0ef991c1..aee69f9743 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressBindAccountRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressBindAccountRequest.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express.request;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressGetOrderRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressGetOrderRequest.java
index 6fe03ddae9..419be9e600 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressGetOrderRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressGetOrderRequest.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express.request;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressPrinterUpdateRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressPrinterUpdateRequest.java
index da47f77042..e3aea495fa 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressPrinterUpdateRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressPrinterUpdateRequest.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express.request;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressTestUpdateOrderRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressTestUpdateOrderRequest.java
index c0a8561243..3377a7e77d 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressTestUpdateOrderRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressTestUpdateOrderRequest.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express.request;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
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 fb47057d87..9502eee826 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
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express.result;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaAssistantResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaAssistantResult.java
index 4137efc9fd..b508b2e09d 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaAssistantResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaAssistantResult.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.live;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import lombok.Data;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
index be89978728..9c8fc4016c 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
@@ -1,6 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.live;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java
index 94e09bc5ca..73104bd367 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java
@@ -1,7 +1,7 @@
 package cn.binarywang.wx.miniapp.config.impl;
 
 import cn.binarywang.wx.miniapp.config.WxMaConfig;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
 
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheAuditMediaUploadRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/ApacheAuditMediaUploadRequestExecutor.java
similarity index 82%
rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheAuditMediaUploadRequestExecutor.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/ApacheAuditMediaUploadRequestExecutor.java
index a390b9f9db..782dc46f29 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheAuditMediaUploadRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/ApacheAuditMediaUploadRequestExecutor.java
@@ -1,15 +1,15 @@
-package me.chanjar.weixin.common.util.http.apache;
+package cn.binarywang.wx.miniapp.executor;
 
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.bean.result.WxAuditMediaUploadResult;
 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.AuditMediaUploadRequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 
+import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
+import cn.binarywang.wx.miniapp.bean.WxMaAuditMediaUploadResult;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpHost;
 import org.apache.http.client.config.RequestConfig;
@@ -30,7 +30,7 @@ public ApacheAuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
   }
 
   @Override
-  public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+  public WxMaAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
     HttpPost httpPost = new HttpPost(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
@@ -50,7 +50,7 @@ public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) th
       if (error.getErrorCode() != 0) {
         throw new WxErrorException(error);
       }
-      return WxAuditMediaUploadResult.fromJson(responseContent);
+      return WxMaAuditMediaUploadResult.fromJson(responseContent);
     } finally {
       httpPost.releaseConnection();
     }
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/AuditMediaUploadRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/AuditMediaUploadRequestExecutor.java
similarity index 59%
rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/AuditMediaUploadRequestExecutor.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/AuditMediaUploadRequestExecutor.java
index aeb6894e0f..6aad5cfdc3 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/AuditMediaUploadRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/AuditMediaUploadRequestExecutor.java
@@ -1,14 +1,14 @@
-package me.chanjar.weixin.common.util.http;
+package cn.binarywang.wx.miniapp.executor;
 
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.bean.result.WxAuditMediaUploadResult;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.http.ResponseHandler;
 import me.chanjar.weixin.common.enums.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.http.apache.ApacheAuditMediaUploadRequestExecutor;
-import me.chanjar.weixin.common.util.http.jodd.JoddHttpAuditMediaUploadRequestExecutor;
-import me.chanjar.weixin.common.util.http.okhttp.OkHttpAuditMediaUploadRequestExecutor;
+import cn.binarywang.wx.miniapp.bean.WxMaAuditMediaUploadResult;
 
 /**
  * 小程序 提审素材上传接口
@@ -18,7 +18,7 @@
  * @author yangyh22
  * @since 2020/11/14
  */
-public abstract class AuditMediaUploadRequestExecutor implements RequestExecutor {
+public abstract class AuditMediaUploadRequestExecutor implements RequestExecutor {
 
   protected RequestHttp requestHttp;
 
@@ -27,11 +27,11 @@ public AuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
   }
 
   @Override
-  public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+  public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
     handler.handle(this.execute(uri, data, wxType));
   }
 
-  public static RequestExecutor create(RequestHttp requestHttp) {
+  public static RequestExecutor create(RequestHttp requestHttp) {
     switch (requestHttp.getRequestType()) {
       case APACHE_HTTP:
         return new ApacheAuditMediaUploadRequestExecutor(requestHttp);
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpAuditMediaUploadRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpAuditMediaUploadRequestExecutor.java
similarity index 77%
rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpAuditMediaUploadRequestExecutor.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpAuditMediaUploadRequestExecutor.java
index 4747dc8438..cce7990983 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpAuditMediaUploadRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpAuditMediaUploadRequestExecutor.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.common.util.http.jodd;
+package cn.binarywang.wx.miniapp.executor;
 
 import java.io.File;
 import java.io.IOException;
@@ -8,12 +8,11 @@
 import jodd.http.HttpRequest;
 import jodd.http.HttpResponse;
 import jodd.http.ProxyInfo;
-import me.chanjar.weixin.common.bean.result.WxAuditMediaUploadResult;
 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.AuditMediaUploadRequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
+import cn.binarywang.wx.miniapp.bean.WxMaAuditMediaUploadResult;
 
 /**
  * @author yangyh22
@@ -26,7 +25,7 @@ public JoddHttpAuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
   }
 
   @Override
-  public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+  public WxMaAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
     HttpRequest request = HttpRequest.post(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
@@ -41,6 +40,6 @@ public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) th
     if (error.getErrorCode() != 0) {
       throw new WxErrorException(error);
     }
-    return WxAuditMediaUploadResult.fromJson(responseContent);
+    return WxMaAuditMediaUploadResult.fromJson(responseContent);
   }
 }
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpAuditMediaUploadRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpAuditMediaUploadRequestExecutor.java
similarity index 77%
rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpAuditMediaUploadRequestExecutor.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpAuditMediaUploadRequestExecutor.java
index 78f4c4af0f..808f16d838 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpAuditMediaUploadRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpAuditMediaUploadRequestExecutor.java
@@ -1,14 +1,14 @@
-package me.chanjar.weixin.common.util.http.okhttp;
+package cn.binarywang.wx.miniapp.executor;
 
 import java.io.File;
 import java.io.IOException;
 
-import me.chanjar.weixin.common.bean.result.WxAuditMediaUploadResult;
 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.AuditMediaUploadRequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
+import cn.binarywang.wx.miniapp.bean.WxMaAuditMediaUploadResult;
+import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
 import okhttp3.MediaType;
 import okhttp3.MultipartBody;
 import okhttp3.OkHttpClient;
@@ -27,7 +27,7 @@ public OkHttpAuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
   }
 
   @Override
-  public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+  public WxMaAuditMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
 
     RequestBody body = new MultipartBody.Builder()
       .setType(MediaType.parse("multipart/form-data"))
@@ -43,7 +43,7 @@ public WxAuditMediaUploadResult execute(String uri, File file, WxType wxType) th
     if (error.getErrorCode() != 0) {
       throw new WxErrorException(error);
     }
-    return WxAuditMediaUploadResult.fromJson(responseContent);
+    return WxMaAuditMediaUploadResult.fromJson(responseContent);
   }
 
 }
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/executor/QrcodeBytesRequestExecutor.java
similarity index 98%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeBytesRequestExecutor.java
index bd473fb21c..ab2d262f2c 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/executor/QrcodeBytesRequestExecutor.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util;
+package cn.binarywang.wx.miniapp.executor;
 
 import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
 import me.chanjar.weixin.common.enums.WxType;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeFileRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeFileRequestExecutor.java
similarity index 98%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeFileRequestExecutor.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeFileRequestExecutor.java
index 8d5d674356..6580678efb 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeFileRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeFileRequestExecutor.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util;
+package cn.binarywang.wx.miniapp.executor;
 
 import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
 import me.chanjar.weixin.common.enums.WxType;
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/executor/QrcodeRequestExecutor.java
similarity index 98%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeRequestExecutor.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeRequestExecutor.java
index d3b764ff1a..83e710dc10 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/executor/QrcodeRequestExecutor.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util;
+package cn.binarywang.wx.miniapp.executor;
 
 import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
 import me.chanjar.weixin.common.enums.WxType;
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/json/WxMaGsonBuilder.java
similarity index 94%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/WxMaGsonBuilder.java
index 21b582d5bd..e6f6842fa2 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/json/WxMaGsonBuilder.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json;
 
 import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
 import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
@@ -7,6 +7,7 @@
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitDistribution;
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeCommitRequest;
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeVersionDistribution;
+import cn.binarywang.wx.miniapp.json.adaptor.*;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaCodeCommitRequestGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaCodeCommitRequestGsonAdapter.java
old mode 100755
new mode 100644
similarity index 90%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaCodeCommitRequestGsonAdapter.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaCodeCommitRequestGsonAdapter.java
index 410f86ca1f..accf80fc93
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaCodeCommitRequestGsonAdapter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaCodeCommitRequestGsonAdapter.java
@@ -1,6 +1,7 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json.adaptor;
 
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeCommitRequest;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonSerializationContext;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaCodeVersionDistributionGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaCodeVersionDistributionGsonAdapter.java
similarity index 97%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaCodeVersionDistributionGsonAdapter.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaCodeVersionDistributionGsonAdapter.java
index 027ca6a959..018be6b046 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaCodeVersionDistributionGsonAdapter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaCodeVersionDistributionGsonAdapter.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json.adaptor;
 
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeVersionDistribution;
 import com.google.gson.JsonArray;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaRetainInfoGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaRetainInfoGsonAdapter.java
similarity index 97%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaRetainInfoGsonAdapter.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaRetainInfoGsonAdapter.java
index a51972b4bd..2e71f9eb4e 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaRetainInfoGsonAdapter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaRetainInfoGsonAdapter.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json.adaptor;
 
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaRetainInfo;
 import com.google.gson.JsonArray;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaSubscribeMessageGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaSubscribeMessageGsonAdapter.java
similarity index 96%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaSubscribeMessageGsonAdapter.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaSubscribeMessageGsonAdapter.java
index 89f8bad8d3..ac877f8b21 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaSubscribeMessageGsonAdapter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaSubscribeMessageGsonAdapter.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json.adaptor;
 
 import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
 import com.google.gson.JsonElement;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaUniformMessageGsonAdapter.java
similarity index 98%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapter.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaUniformMessageGsonAdapter.java
index 75ccd68aaa..3f81914d0c 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaUniformMessageGsonAdapter.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json.adaptor;
 
 import java.lang.reflect.Type;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaUserPortraitGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaUserPortraitGsonAdapter.java
similarity index 98%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaUserPortraitGsonAdapter.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaUserPortraitGsonAdapter.java
index b8a7c448ff..c99fd67ba3 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaUserPortraitGsonAdapter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaUserPortraitGsonAdapter.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json.adaptor;
 
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaUserPortrait;
 import com.google.gson.JsonArray;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaVisitDistributionGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaVisitDistributionGsonAdapter.java
similarity index 97%
rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaVisitDistributionGsonAdapter.java
rename to weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaVisitDistributionGsonAdapter.java
index 0fc79d44bd..74ae61821b 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaVisitDistributionGsonAdapter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/json/adaptor/WxMaVisitDistributionGsonAdapter.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json.adaptor;
 
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitDistribution;
 import com.google.gson.JsonArray;
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImplTest.java
index 6991ad9c25..bf6e23797e 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImplTest.java
@@ -7,7 +7,7 @@
 import cn.binarywang.wx.miniapp.bean.express.result.WxMaExpressOrderInfoResult;
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
 import cn.binarywang.wx.miniapp.test.ApiTestModule;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.inject.Inject;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.lang3.StringUtils;
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/json/WxMaUniformMessageGsonAdapterTest.java
similarity index 98%
rename from weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java
rename to weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/json/WxMaUniformMessageGsonAdapterTest.java
index 1ae60070cd..7b19136aff 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/json/WxMaUniformMessageGsonAdapterTest.java
@@ -1,4 +1,4 @@
-package cn.binarywang.wx.miniapp.util.json;
+package cn.binarywang.wx.miniapp.json;
 
 import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
 import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
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 a8c252bae0..24d9e23414 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
@@ -4,7 +4,7 @@
 import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.config.WxMaConfig;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import me.chanjar.weixin.common.error.WxErrorException;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java
index 00e2ede652..be823c8da1 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java
@@ -8,6 +8,7 @@
 import com.github.binarywang.wxpay.service.EntPayService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.util.SignUtils;
+import lombok.RequiredArgsConstructor;
 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.bouncycastle.openssl.PEMParser;
@@ -30,17 +31,9 @@
  *
  * @author Binary Wang
  */
+@RequiredArgsConstructor
 public class EntPayServiceImpl implements EntPayService {
-  private WxPayService payService;
-
-  /**
-   * Instantiates a new Ent pay service.
-   *
-   * @param payService the pay service
-   */
-  public EntPayServiceImpl(WxPayService payService) {
-    this.payService = payService;
-  }
+  private final WxPayService payService;
 
   @Override
   public EntPayResult entPay(EntPayRequest request) throws WxPayException {
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayTradeFundBillResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayBillResultTest.java
similarity index 100%
rename from weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayTradeFundBillResultTest.java
rename to weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayBillResultTest.java

From c0af379370d55adb28abe58a547481c1f963fbfd Mon Sep 17 00:00:00 2001
From: Gyv12345 
Date: Fri, 27 Nov 2020 09:52:55 +0800
Subject: [PATCH 04/12] =?UTF-8?q?:art:=20#1888=E3=80=90=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=E8=A1=A5=E5=85=85=E5=AE=8C=E5=96=84?=
 =?UTF-8?q?OA=E5=AE=A1=E6=89=B9=E5=9B=9E=E8=B0=83=E4=BA=8B=E4=BB=B6?=
 =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=83=A8=E5=88=86=E5=AD=97=E6=AE=B5=E7=BC=BA?=
 =?UTF-8?q?=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../cp/bean/message/WxCpXmlMessage.java       | 189 +++++++++++++++++-
 1 file changed, 187 insertions(+), 2 deletions(-)

diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java
index 36ea3fc3fb..40f66df5e0 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java
@@ -547,6 +547,9 @@ public static class SendLocationInfo implements Serializable {
 
   }
 
+  /**
+   * 审批信息
+   */
   @XStreamAlias("ApprovalInfo")
   @Data
   public static class ApprovalInfo implements Serializable {
@@ -557,11 +560,14 @@ public static class ApprovalInfo implements Serializable {
      */
     @XStreamAlias("SpNo")
     private String spNo;
+
     /**
      * 审批申请类型名称(审批模板名称)
      */
     @XStreamAlias("SpName")
+    @XStreamConverter(value = XStreamCDataConverter.class)
     private String spName;
+
     /**
      * 申请单状态:1-审批中;2-已通过;3-已驳回;4-已撤销;6-通过后撤销;7-已删除;10-已支付
      */
@@ -572,35 +578,214 @@ public static class ApprovalInfo implements Serializable {
      * 审批模板id。
      */
     @XStreamAlias("TemplateId")
+    @XStreamConverter(value = XStreamCDataConverter.class)
     private String templateId;
     /**
      * 审批申请提交时间,Unix时间戳
      */
     @XStreamAlias("ApplyTime")
-    private Integer applyTime;
+    private Long applyTime;
 
     /**
      * 申请人信息
      */
     @XStreamAlias("Applyer")
     private Applier applier;
+
+    /**
+     * 审批流程信息,可能有多个审批节点。
+     */
+    @XStreamImplicit(itemFieldName="SpRecord")
+    private List spRecords;
+
+    /**
+     * 抄送信息,可能有多个抄送节点
+     * 这回查字典,notifier通知人,Notifyer这不知道是什么
+     */
+    @XStreamImplicit(itemFieldName="Notifyer")
+    private List notifier;
+
+    /**
+     * 审批申请备注信息,可能有多个备注节点
+     */
+    @XStreamImplicit(itemFieldName="Comments")
+    private List comments;
+
     /**
      * 审批申请单变化类型
      */
     @XStreamAlias("StatuChangeEvent")
     private Integer statusChangeEvent;
 
+    /**
+     * 申请人信息
+     */
     @XStreamAlias("Applyer")
     @Data
     public static class Applier implements Serializable {
       private static final long serialVersionUID = -979255011922209018L;
 
-      @XStreamAlias("Applyer")
+      /**
+       * 申请人userid
+       */
+      @XStreamAlias("UserId")
       private String userId;
+
+      /**
+       * 申请人所在部门pid
+       */
       @XStreamAlias("Party")
       private String party;
     }
 
+    /**
+     * 审批流程信息
+     */
+    @XStreamAlias("SpRecord")
+    @Data
+    public static class SpRecord implements Serializable{
+
+      private static final long serialVersionUID = 1247535623941881764L;
+
+      /**
+       * 审批节点状态:1-审批中;2-已同意;3-已驳回;4-已转审
+       */
+      @XStreamAlias("SpStatus")
+      private String spStatus;
+
+      /**
+       * 节点审批方式:1-或签;2-会签
+       */
+      @XStreamAlias("ApproverAttr")
+      private String approverAttr;
+
+      /**
+       * 审批节点详情。当节点为标签或上级时,一个节点可能有多个分支
+       */
+      @XStreamImplicit(itemFieldName="Details")
+      private List details;
+
+    }
+
+    /**
+     * 审批节点详情
+     */
+    @XStreamAlias("Details")
+    @Data
+    public static class Detail implements Serializable{
+
+      private static final long serialVersionUID = -8446107461495047603L;
+
+      /**
+       * 分支审批人
+       */
+      @XStreamAlias("Approver")
+      private Approver approver;
+
+      /**
+       * 审批意见字段
+       */
+      @XStreamAlias("Speech")
+      private String speech;
+
+      /**
+       * 分支审批人审批状态:1-审批中;2-已同意;3-已驳回;4-已转审
+       */
+      @XStreamAlias("SpStatus")
+      private String spStatus;
+
+      /**
+       * 节点分支审批人审批操作时间,0为尚未操作
+       */
+      @XStreamAlias("SpTime")
+      private Long spTime;
+
+      /**
+       * 节点分支审批人审批意见附件,赋值为media_id具体使用请参考:文档-获取临时素材
+       */
+      @XStreamAlias("Attach")
+      private String attach;
+    }
+
+    /**
+     * 分支审批人
+     */
+    @Data
+    @XStreamAlias("Approver")
+    public static class Approver implements  Serializable{
+
+      private static final long serialVersionUID = 7360442444186683191L;
+
+      /**
+       * 分支审批人userid
+       */
+      @XStreamAlias("UserId")
+      private String userId;
+    }
+
+    /**
+     * 抄送信息
+     */
+    @Data
+    @XStreamAlias("Notifyer")
+    public static class Notifier implements Serializable{
+
+      private static final long serialVersionUID = -4524071522890013920L;
+
+      /**
+       * 节点抄送人userid
+       */
+      @XStreamAlias("UserId")
+      private String userId;
+    }
+
+    /**
+     * 审批申请备注信息
+     */
+    @Data
+    @XStreamAlias("Comments")
+    public static class Comment implements Serializable{
+
+      private static final long serialVersionUID = 6912156206252719485L;
+
+      /**
+       * 备注人信息
+       */
+      @XStreamAlias("CommentUserInfo")
+      private CommentUserInfo commentUserInfo;
+
+      /**
+       * 备注提交时间
+       */
+      @XStreamAlias("CommentTime")
+      private String commentTime;
+
+      /**
+       * 备注文本内容
+       */
+      @XStreamAlias("CommentContent")
+      private String commentContent;
+
+      /**
+       * 备注id
+       */
+      @XStreamAlias("CommentId")
+      private String commentId;
+
+    }
+
+    @Data
+    @XStreamAlias("CommentUserInfo")
+    private static class CommentUserInfo implements Serializable{
+
+      private static final long serialVersionUID = 5031739716823000947L;
+
+      /**
+       * 备注人userid
+       */
+      @XStreamAlias("UserId")
+      private String userId;
+    }
   }
 
 }

From 0e2186632a30a40b854609d9732477cdfc184d1b Mon Sep 17 00:00:00 2001
From: LinXiaoHuChong 
Date: Sun, 29 Nov 2020 23:00:38 +0800
Subject: [PATCH 05/12] =?UTF-8?q?:new:=20#1746:=20=E3=80=90=E4=BC=81?=
 =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E7=AC=AC=E4=B8=89=E6=96=B9?=
 =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=A2=9E=E5=8A=A0=E6=8E=88=E6=9D=83=E9=85=8D?=
 =?UTF-8?q?=E7=BD=AE=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=90=8C=E6=97=B6=E5=A2=9E?=
 =?UTF-8?q?=E5=8A=A0=E5=90=91=E5=91=98=E5=B7=A5=E4=BB=98=E6=AC=BE=E7=9A=84?=
 =?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/cp/tp/service/WxCpTpService.java   |  16 +-
 .../service/impl/BaseWxCpTpServiceImpl.java   |  25 ++
 .../bean/entwxpay/EntWxEmpPayRequest.java     | 229 ++++++++++++++++++
 .../wxpay/service/EntPayService.java          |  12 +
 .../wxpay/service/impl/EntPayServiceImpl.java |  19 ++
 .../binarywang/wxpay/util/SignUtils.java      |  25 +-
 6 files changed, 324 insertions(+), 2 deletions(-)
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java

diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/WxCpTpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/WxCpTpService.java
index 9bc3684ef6..1047368832 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/WxCpTpService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/WxCpTpService.java
@@ -154,6 +154,20 @@ public interface WxCpTpService {
    */
   String getPreAuthUrl(String redirectUri, String state) throws WxErrorException;
 
+  /**
+   * 
+   *   获取预授权链接,测试环境下使用
+   *   @Link https://work.weixin.qq.com/api/doc/90001/90143/90602
+   * 
+ * + * @param redirectUri 授权完成后的回调网址 + * @param state a-zA-Z0-9的参数值(不超过128个字节),用于第三方自行校验session,防止跨域攻击 + * @param authType 授权类型:0 正式授权, 1 测试授权。 + * @return pre auth url + * @throws WxErrorException the wx error exception + */ + String getPreAuthUrl(String redirectUri, String state, int authType) throws WxErrorException; + /** * 获取企业的授权信息 * @@ -278,7 +292,7 @@ public interface WxCpTpService { *
    * 获取访问用户敏感信息
    * 
- * + * * @param userTicket * @return */ diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java index c3bbe95c65..5726204fbd 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java @@ -1,6 +1,7 @@ package me.chanjar.weixin.cp.tp.service.impl; import com.google.common.base.Joiner; +import com.google.gson.Gson; import com.google.gson.JsonObject; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -210,6 +211,30 @@ public String getPreAuthUrl(String redirectUri, String state) throws WxErrorExce return preAuthUrl; } + @Override + @SneakyThrows + public String getPreAuthUrl(String redirectUri, String state, int authType) throws WxErrorException { + String result = get(configStorage.getApiUrl(GET_PREAUTH_CODE), null); + WxCpTpPreauthCode preAuthCode = WxCpTpPreauthCode.fromJson(result); + String setSessionUrl = "https://qyapi.weixin.qq.com/cgi-bin/service/set_session_info"; + + Map sessionInfo = new HashMap<>(1); + sessionInfo.put("auth_type", authType); + Map param = new HashMap<>(2); + param.put("pre_auth_code", preAuthCode.getPreAuthCode()); + param.put("session_info", sessionInfo); + String postData = new Gson().toJson(param); + + post(setSessionUrl, postData); + + String preAuthUrl = "https://open.work.weixin.qq.com/3rdapp/install?suite_id=" + configStorage.getSuiteId() + + "&pre_auth_code=" + preAuthCode.getPreAuthCode() + "&redirect_uri=" + URLEncoder.encode(redirectUri, "utf-8"); + if (StringUtils.isNotBlank(state)) { + preAuthUrl += "&state=" + state; + } + return preAuthUrl; + } + @Override public WxCpTpAuthInfo getAuthInfo(String authCorpId, String permanentCode) throws WxErrorException { JsonObject jsonObject = new JsonObject(); diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java new file mode 100644 index 0000000000..37c0d038dd --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java @@ -0,0 +1,229 @@ +package com.github.binarywang.wxpay.bean.entwxpay; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; + +import java.util.Map; + +/** + * Created on 2020/11/29. + * 向员工付款请求对象 + * @author 拎小壶冲 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class EntWxEmpPayRequest extends BaseWxPayRequest { + + /** + *
+   * 字段名:商户订单号.
+   * 变量名:partner_trade_no
+   * 是否必填:是
+   * 示例值:10000098201411111234567890
+   * 类型:String
+   * 描述:商户订单号
+   * 
+ */ + @Required + @XStreamAlias("partner_trade_no") + private String partnerTradeNo; + + /** + *
+   * 字段名:需保持唯一性 用户openid.
+   * 变量名:openid
+   * 是否必填:是
+   * 示例值:oxTWIuGaIt6gTKsQRLau2M0yL16E
+   * 类型:String
+   * 描述:商户appid下,某用户的openid
+   * 
+ */ + @Required + @XStreamAlias("openid") + private String openid; + + /** + *
+   * 字段名:设备号.
+   * 变量名:device_info
+   * 是否必填:否
+   * 示例值:13467007045764
+   * 类型:String(32)
+   * 描述:微信支付分配的终端设备号
+   * 
+ */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *
+   * 字段名:校验用户姓名选项.
+   * 变量名:check_name
+   * 是否必填:是
+   * 示例值:OPTION_CHECK
+   * 类型:String
+   * 描述:NO_CHECK:不校验真实姓名 
+   * FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) 
+   * OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
+   * 
+ */ + @Required + @XStreamAlias("check_name") + private String checkName; + + /** + *
+   * 字段名:收款用户姓名.
+   * 变量名:re_user_name
+   * 是否必填:可选
+   * 示例值:马花花
+   * 类型:String
+   * 描述:收款用户真实姓名。
+   * 如果check_name设置为FORCE_CHECK或OPTION_CHECK,  则必填用户真实姓名
+   * 
+ */ + @XStreamAlias("re_user_name") + private String reUserName; + + /** + *
+   * 字段名:金额.
+   * 变量名:amount
+   * 是否必填:是
+   * 示例值:10099
+   * 类型:int
+   * 描述:企业付款金额, 单位为分
+   * 
+ */ + @Required + @XStreamAlias("amount") + private Integer amount; + + /** + *
+   * 字段名:企业付款描述信息.
+   * 变量名:desc
+   * 是否必填:是
+   * 示例值:理赔
+   * 类型:String
+   * 描述:企业付款操作说明信息。必填。
+   * 
+ */ + @Required + @XStreamAlias("desc") + private String description; + + /** + *
+   * 字段名:Ip地址.
+   * 变量名:spbill_create_ip
+   * 是否必填:是
+   * 示例值:192.168.0.1
+   * 类型:String(32)
+   * 描述:调用接口的机器Ip地址
+   * 
+ */ + @Required + @XStreamAlias("spbill_create_ip") + private String spbillCreateIp; + + /** + *
+   *   字段名: 付款消息类型
+   *   变量名: ww_msg_type
+   *   是否必填: 是
+   *   示例值:NORMAL_MSG
+   *   描述:NORMAL_MSG:普通付款消息 APPROVAL _MSG:审批付款消息
+   * 
+ */ + @Required + @XStreamAlias("ww_msg_type") + private String wwMsgType; + + /** + *
+   *   字段名: 审批单号
+   *   变量名: approval_number
+   *   是否必填: 否
+   *   示例值: 201705160008
+   *   描述:ww_msg_type为APPROVAL _MSG时,需要填写approval_number
+   * 
+ */ + @XStreamAlias("approval_number") + private String approvalNumber; + + /** + *
+   *   字段名: 审批类型
+   *   变量名: approval_type
+   *   是否必填: 否
+   *   示例值: 1
+   *   描述:ww_msg_type为APPROVAL _MSG时,需要填写1
+   * 
+ */ + @XStreamAlias("approval_type") + private Integer approvalType; + + + /** + *
+   *   字段名: 项目名称
+   *   变量名: act_name
+   *   是否必填: 是
+   *   示例值: 产品部门报销
+   *   描述:项目名称,最长50个utf8字符
+   * 
+ */ + @Required + @XStreamAlias("act_name") + private String actName; + + /** + *
+   *   字段名: 付款的应用id
+   *   变量名: agentid
+   *   是否必填: 否
+   *   示例值: 1
+   *   描述:以企业应用的名义付款,企业应用id,整型,可在企业微信管理端应用的设置页面查看。
+   * 
+ */ + @XStreamAlias("agentid") + private Integer agentId; + + + @Override + protected void checkConstraints() throws WxPayException { + + } + + @Override + protected boolean isWxWorkSign() { + return true; + } + + @Override + protected void storeMap(Map map) { + map.put("appid", appid); + map.put("mch_id", mchId); + map.put("device_info", deviceInfo); + map.put("partner_trade_no", partnerTradeNo); + map.put("openid", openid); + map.put("check_name", checkName); + map.put("re_user_name", reUserName); + map.put("amount", amount.toString()); + map.put("desc", description); + map.put("spbill_create_ip", spbillCreateIp); + map.put("act_name", actName); + map.put("ww_msg_type", wwMsgType); + map.put("approval_number", approvalNumber); + map.put("approval_type", approvalType.toString()); + map.put("agentid", agentId.toString()); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java index 1b1b76b154..ed159275bf 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java @@ -1,6 +1,7 @@ package com.github.binarywang.wxpay.service; import com.github.binarywang.wxpay.bean.entpay.*; +import com.github.binarywang.wxpay.bean.entwxpay.EntWxEmpPayRequest; import com.github.binarywang.wxpay.exception.WxPayException; /** @@ -143,4 +144,15 @@ public interface EntPayService { * @throws WxPayException the wx pay exception */ EntPayRedpackQueryResult queryEnterpriseRedpack(EntPayRedpackQueryRequest request) throws WxPayException; + + /** + * 向员工付款 + * 文档详见 https://work.weixin.qq.com/api/doc/90000/90135/90278 + * 接口链接 https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/paywwsptrans2pocket + * + * @param request 请求对象 + * @return EntPayResult the ent pay result + * @throws WxPayException the wx pay exception + */ + EntPayResult toEmpPay(EntWxEmpPayRequest request) throws WxPayException; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java index be823c8da1..db464936c7 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java @@ -1,6 +1,7 @@ package com.github.binarywang.wxpay.service.impl; import com.github.binarywang.wxpay.bean.entpay.*; +import com.github.binarywang.wxpay.bean.entwxpay.EntWxEmpPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayDefaultRequest; import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; import com.github.binarywang.wxpay.constant.WxPayConstants; @@ -151,6 +152,24 @@ public EntPayRedpackQueryResult queryEnterpriseRedpack(EntPayRedpackQueryRequest return result; } + @Override + public EntPayResult toEmpPay(EntWxEmpPayRequest request) throws WxPayException { + //企业微信签名,需要在请求签名之前 + request.setNonceStr(String.valueOf(System.currentTimeMillis())); + request.setWorkWxSign(SignUtils.createEntSign(request.getAmount(), request.getAppid(), request.getDescription(), + request.getMchId(), request.getNonceStr(), request.getOpenid(), request.getPartnerTradeNo(), + request.getWwMsgType(), payService.getConfig().getEntPayKey(), WxPayConstants.SignType.MD5)); + + request.checkAndSign(this.payService.getConfig()); + + String url = this.payService.getPayBaseUrl() + "/mmpaymkttransfers/promotion/paywwsptrans2pocket"; + String responseContent = this.payService.post(url, request.toXML(), true); + final EntPayResult result = BaseWxPayResult.fromXML(responseContent, EntPayResult.class); + + result.checkResult(this.payService, request.getSignType(), true); + return result; + } + private String encryptRSA(File publicKeyFile, String srcString) throws WxPayException { try { Security.addProvider(new BouncyCastleProvider()); 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 0ce39a7312..9e005a813e 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 @@ -127,6 +127,30 @@ public static String createEntSign(String actName, String mchBillNo, String mchI sortedMap.put("total_amount", totalAmount + ""); sortedMap.put("wxappid", wxAppId); + return toSignBuilder(sortedMap, signKey, signType); + } + + /** + * 企业微信签名 + * @param signType md5 目前接口要求使用的加密类型 + */ + public static String createEntSign(Integer totalAmount, String appId, String description, String mchId, + String nonceStr, String openid, String partnerTradeNo, String wwMsgType, + String signKey, String signType) { + Map sortedMap = new HashMap<>(8); + sortedMap.put("amount", String.valueOf(totalAmount)); + sortedMap.put("appid", appId); + sortedMap.put("desc", description); + sortedMap.put("mch_id", mchId); + sortedMap.put("nonce_str", nonceStr); + sortedMap.put("openid", openid); + sortedMap.put("partner_trade_no", partnerTradeNo); + sortedMap.put("ww_msg_type", wwMsgType); + + return toSignBuilder(sortedMap, signKey, signType); + } + + private static String toSignBuilder(Map sortedMap, String signKey, String signType) { Iterator> iterator = new TreeMap<>(sortedMap).entrySet().iterator(); StringBuilder toSign = new StringBuilder(); while (iterator.hasNext()) { @@ -148,7 +172,6 @@ public static String createEntSign(String actName, String mchBillNo, String mchI } else { return DigestUtils.md5Hex(toSign.toString()).toUpperCase(); } - } /** From b0440e0faade0703859fc913f9585fb0b210c5a7 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 29 Nov 2020 23:39:17 +0800 Subject: [PATCH 06/12] =?UTF-8?q?:art:=20#1886=20=E3=80=90=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=88=9B=E5=BB=BA=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E9=97=B4=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=A0=81=E5=9C=B0=E5=9D=80=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/api/WxMaLiveService.java | 7 +-- .../miniapp/api/impl/WxMaLiveServiceImpl.java | 61 ++++++++++--------- .../bean/live/WxMaCreateRoomResult.java | 30 +++++++++ .../api/impl/WxMaLiveServiceImplTest.java | 7 ++- 4 files changed, 68 insertions(+), 37 deletions(-) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaCreateRoomResult.java 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 96e6d879b4..78cb4d497d 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,9 +1,6 @@ package cn.binarywang.wx.miniapp.api; -import cn.binarywang.wx.miniapp.bean.live.WxMaAssistantResult; -import cn.binarywang.wx.miniapp.bean.live.WxMaLiveAssistantInfo; -import cn.binarywang.wx.miniapp.bean.live.WxMaLiveResult; -import cn.binarywang.wx.miniapp.bean.live.WxMaLiveRoomInfo; +import cn.binarywang.wx.miniapp.bean.live.*; import me.chanjar.weixin.common.error.WxErrorException; import java.util.List; @@ -41,7 +38,7 @@ public interface WxMaLiveService { * @return . * @throws WxErrorException . */ - Integer createRoom(WxMaLiveRoomInfo roomInfo) throws WxErrorException; + WxMaCreateRoomResult createRoom(WxMaLiveRoomInfo roomInfo) 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 cc3b266dc7..1fcd23e51c 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,10 +2,7 @@ import cn.binarywang.wx.miniapp.api.WxMaLiveService; import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.live.WxMaAssistantResult; -import cn.binarywang.wx.miniapp.bean.live.WxMaLiveAssistantInfo; -import cn.binarywang.wx.miniapp.bean.live.WxMaLiveResult; -import cn.binarywang.wx.miniapp.bean.live.WxMaLiveRoomInfo; +import cn.binarywang.wx.miniapp.bean.live.*; import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder; import com.google.common.base.Joiner; import com.google.gson.JsonObject; @@ -31,16 +28,19 @@ @Slf4j @AllArgsConstructor public class WxMaLiveServiceImpl implements WxMaLiveService { + private static final String ERR_CODE = "errcode"; + private static final String ROOM_ID = "roomId"; private final WxMaService wxMaService; @Override - public Integer createRoom(WxMaLiveRoomInfo roomInfo) throws WxErrorException { + public WxMaCreateRoomResult createRoom(WxMaLiveRoomInfo roomInfo) throws WxErrorException { String responseContent = this.wxMaService.post(CREATE_ROOM, WxMaGsonBuilder.create().toJson(roomInfo)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } - return jsonObject.get("roomId").getAsInt(); + + return WxMaGsonBuilder.create().fromJson(responseContent, WxMaCreateRoomResult.class); } @Override @@ -49,7 +49,7 @@ public boolean deleteRoom(Integer roomId) throws WxErrorException { map.put("id", roomId); String responseContent = this.wxMaService.post(DELETE_ROOM, WxMaGsonBuilder.create().toJson(map)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return true; @@ -59,7 +59,7 @@ public boolean deleteRoom(Integer roomId) throws WxErrorException { public boolean editRoom(WxMaLiveRoomInfo roomInfo) throws WxErrorException { String responseContent = this.wxMaService.post(EDIT_ROOM, WxMaGsonBuilder.create().toJson(roomInfo)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return true; @@ -68,10 +68,10 @@ public boolean editRoom(WxMaLiveRoomInfo roomInfo) throws WxErrorException { @Override public String getPushUrl(Integer roomId) throws WxErrorException { Map map = new HashMap<>(2); - map.put("roomId", roomId); + map.put(ROOM_ID, roomId); String responseContent = this.wxMaService.get(GET_PUSH_URL, Joiner.on("&").withKeyValueSeparator("=").join(map)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return jsonObject.get("pushAddr").getAsString(); @@ -80,13 +80,13 @@ public String getPushUrl(Integer roomId) throws WxErrorException { @Override public String getSharedCode(Integer roomId, String params) throws WxErrorException { Map map = new HashMap<>(2); - map.put("roomId", roomId); + map.put(ROOM_ID, roomId); if (null != params) { map.put("params", params); } String responseContent = this.wxMaService.get(GET_SHARED_CODE, Joiner.on("&").withKeyValueSeparator("=").join(map)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return jsonObject.get("cdnUrl").getAsString(); @@ -135,19 +135,21 @@ public WxMaLiveResult getLiveReplay(String action, Integer roomId, Integer start JsonObject jsonObject = getLiveInfo(start, limit, map); return WxMaLiveResult.fromJson(jsonObject.toString()); } + 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 = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return jsonObject; } + @Override public WxMaLiveResult getLiveReplay(Integer roomId, Integer start, Integer limit) throws WxErrorException { return getLiveReplay("get_replay", roomId, start, limit); @@ -156,11 +158,11 @@ public WxMaLiveResult getLiveReplay(Integer roomId, Integer start, Integer limit @Override public boolean addGoodsToRoom(Integer roomId, List goodsIds) throws WxErrorException { Map map = new HashMap<>(2); - map.put("roomId", roomId); + map.put(ROOM_ID, roomId); map.put("ids", goodsIds); String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return true; @@ -169,38 +171,38 @@ public boolean addGoodsToRoom(Integer roomId, List goodsIds) throws WxE @Override public boolean addAssistant(Integer roomId, List users) throws WxErrorException { Map map = new HashMap<>(2); - map.put("roomId", roomId); + map.put(ROOM_ID, roomId); map.put("users", users); String responseContent = this.wxMaService.post(ADD_ASSISTANT, WxMaGsonBuilder.create().toJson(map)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return true; } @Override - public boolean modifyAssistant(Integer roomId, String username,String nickname) throws WxErrorException { + public boolean modifyAssistant(Integer roomId, String username, String nickname) throws WxErrorException { Map map = new HashMap<>(2); - map.put("roomId", roomId); - map.put("username",username); + map.put(ROOM_ID, roomId); + map.put("username", username); map.put("nickname", nickname); String responseContent = this.wxMaService.post(MODIFY_ASSISTANT, WxMaGsonBuilder.create().toJson(map)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return true; } @Override - public boolean removeAssistant(Integer roomId,String username) throws WxErrorException { + public boolean removeAssistant(Integer roomId, String username) throws WxErrorException { Map map = new HashMap<>(2); - map.put("roomId", roomId); - map.put("username",username); + map.put(ROOM_ID, roomId); + map.put("username", username); String responseContent = this.wxMaService.post(REMOVE_ASSISTANT, WxMaGsonBuilder.create().toJson(map)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return true; @@ -209,14 +211,13 @@ public boolean removeAssistant(Integer roomId,String username) throws WxErrorExc @Override public List getAssistantList(Integer roomId) throws WxErrorException { Map map = new HashMap<>(2); - map.put("roomId", roomId); + map.put(ROOM_ID, roomId); String responseContent = this.wxMaService.post(GET_ASSISTANT_LIST, WxMaGsonBuilder.create().toJson(map)); JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get("errcode").getAsInt() != 0) { + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } return WxMaAssistantResult.fromJson(responseContent).getList(); } - } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaCreateRoomResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaCreateRoomResult.java new file mode 100644 index 0000000000..56b4eb7251 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaCreateRoomResult.java @@ -0,0 +1,30 @@ +package cn.binarywang.wx.miniapp.bean.live; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 创建直播间接口返回. + * + * @author Binary Wang + * @date 2020-11-29 + */ +@Data +public class WxMaCreateRoomResult implements Serializable { + private static final long serialVersionUID = -335928442728127170L; + + /** + * "小程序直播" 小程序码 + * 当主播微信号没有在 “小程序直播“ 小程序实名认证 返回该字段 + */ + @SerializedName("qrcode_url") + private String qrcodeUrl; + + /** + * 房间ID + */ + @SerializedName("roomId") + private Integer roomId; +} 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 1d43b50bee..b9a5b94121 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,6 +1,7 @@ package cn.binarywang.wx.miniapp.api.impl; import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.live.WxMaCreateRoomResult; import cn.binarywang.wx.miniapp.bean.live.WxMaLiveResult; import cn.binarywang.wx.miniapp.bean.live.WxMaLiveRoomInfo; import cn.binarywang.wx.miniapp.test.ApiTestModule; @@ -14,6 +15,7 @@ import java.util.Calendar; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertNotNull; /** @@ -50,8 +52,9 @@ public void createRoom() throws Exception { roomInfo.setCloseLike(0); roomInfo.setCloseGoods(0); roomInfo.setCloseComment(0); - Integer roomId = this.wxService.getLiveService().createRoom(roomInfo); - System.out.println(roomId); + WxMaCreateRoomResult result = this.wxService.getLiveService().createRoom(roomInfo); + assertNotNull(result); + assertThat(result.getRoomId()).isNotNull(); } @Test From bf92d03529dd4021631eb6d1c50c39830389916f Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 29 Nov 2020 23:50:40 +0800 Subject: [PATCH 07/12] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.0.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 589fc3bef5..7118281d00 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.9.9.B + 4.0.0 pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index a7028adf4f..553c01950c 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.9.9.B + 4.0.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 73fd0fdde5..dd243cf015 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.9.9.B + 4.0.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 f5ab99b1ed..6aa7368413 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.9.9.B + 4.0.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 7cd8aa016b..462723d8a6 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.9.9.B + 4.0.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 9cb011a3c9..50ed40360d 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.9.9.B + 4.0.0 4.0.0 diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml index 43b28ab1e7..8e01bca88f 100644 --- a/weixin-graal/pom.xml +++ b/weixin-graal/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.9.9.B + 4.0.0 weixin-graal diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 11b2b4abc8..0dddfb44b0 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.9.9.B + 4.0.0 weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index fa884a6f35..969d9c850b 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.9.9.B + 4.0.0 weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 232f5cf83e..02bbaf21a8 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.9.9.B + 4.0.0 weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 27bbd195ab..5e5815661e 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.9.9.B + 4.0.0 weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 3193581288..a7bd9d05b4 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.9.9.B + 4.0.0 weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 3050ec8f6a..b992e899ed 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.9.9.B + 4.0.0 4.0.0 From ae4f30eed98dbdba052db26b79cbfa89aefbb275 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 30 Nov 2020 00:24:17 +0800 Subject: [PATCH 08/12] =?UTF-8?q?:memo:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ab7ada780b..2418c01269 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ ### 重要信息 -1. **2020-08-24 发布 [【3.9.0正式版】](https://mp.weixin.qq.com/s/xkT7P79SVwkpk85d-2fCUw)**! +1. **2020-11-29 发布 [【4.0.0正式版】](https://mp.weixin.qq.com/s/xkT7P79SVwkpk85d-2fCUw)**! 1. 新手重要提示:本项目仅是一个SDK开发工具包,未提供Web实现,建议使用 `maven` 或 `gradle` 引用本项目即可使用本SDK提供的各种功能,详情可参考 **[【Demo项目】](demo.md)** 或本项目中的部分单元测试代码;另外微信开发新手请务必阅读[【开发文档 Wiki 首页】](https://github.com/Wechat-Group/WxJava/wiki)的常见问题部分,可以少走很多弯路,节省不少时间。 1. 技术交流群:想获得QQ群/微信群/钉钉企业群等信息的同学,请使用微信扫描上面的微信公众号二维码关注 `WxJava` 后点击相关菜单即可获取加入方式,同时也可以在微信中搜索 `weixin-java-tools` 或 `WxJava` 后选择正确的公众号进行关注,该公众号会及时通知SDK相关更新信息,并不定期分享微信Java开发相关技术知识; 1. 付费QQ群:(**注意:刚入群会有5分钟禁言,稍等片刻即可正常发言**) [![加入QQ群](https://img.shields.io/badge/QQ群-343954419-blue.svg)](http://shang.qq.com/wpa/qunwpa?idkey=731dc3e7ea31ebe25376cc1a791445468612c63fd0e9e05399b088ec81fd9e15) 或 [![加入QQ群](https://img.shields.io/badge/QQ群-343954419-blue.svg)](http://jq.qq.com/?_wv=1027&k=40lRskK),或者请自行搜索群号`343954419`进行添加;当然由于某种原因无法入群的,可关注公众号后获取其他群的加入方式; @@ -68,7 +68,7 @@ com.github.binarywang (不同模块参考下文) - 3.9.0 + 4.0.0 ``` From 350d2b2bdae7c6981c22ef8273c9b9348c136505 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 30 Nov 2020 12:16:23 +0800 Subject: [PATCH 09/12] Update demo.md --- demo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo.md b/demo.md index b1953e077c..7d05f4d683 100644 --- a/demo.md +++ b/demo.md @@ -17,6 +17,6 @@ 1. 开放平台 Demo:[GitHub](http://github.com/Wechat-Group/weixin-java-open-demo)、[码云](http://gitee.com/binary/weixin-java-open-demo) [![Build Status](https://travis-ci.org/Wechat-Group/weixin-java-open-demo.svg?branch=master)](https://travis-ci.org/Wechat-Group/weixin-java-open-demo) 1. 公众号 Demo: - 使用 `Spring MVC` 实现的公众号 Demo:[GitHub](http://github.com/binarywang/weixin-java-mp-demo-springmvc)、[码云](https://gitee.com/binary/weixin-java-mp-demo) [![Build Status](https://travis-ci.org/binarywang/weixin-java-mp-demo-springmvc.svg?branch=master)](https://travis-ci.org/binarywang/weixin-java-mp-demo-springmvc) - - 使用 `Spring Boot` 实现的公众号 Demo(支持多公众号):[GitHub](http://github.com/binarywang/weixin-java-mp-demo-springboot)、[码云](http://gitee.com/binary/weixin-java-mp-demo-springboot) [![Build Status](https://travis-ci.org/binarywang/weixin-java-mp-demo-springboot.svg?branch=master)](https://travis-ci.org/binarywang/weixin-java-mp-demo-springboot) + - 使用 `Spring Boot` 实现的公众号 Demo(支持多公众号):[GitHub](http://github.com/binarywang/weixin-java-mp-demo)、[码云](http://gitee.com/binary/weixin-java-mp-demo-springboot) [![Build Status](https://travis-ci.org/binarywang/weixin-java-mp-demo.svg?branch=master)](https://travis-ci.org/binarywang/weixin-java-mp-demo) - 含公众号和部分微信支付代码的 Demo:[GitHub](http://github.com/Wechat-Group/weixin-java-demo-springmvc)、[码云](http://gitee.com/binary/weixin-java-tools-springmvc) [![Build Status](https://travis-ci.org/Wechat-Group/weixin-java-demo-springmvc.svg?branch=master)](https://travis-ci.org/Wechat-Group/weixin-java-demo-springmvc) From 45297e7f4df4e73a566edc840009e8e61c45fc29 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 30 Nov 2020 16:47:05 +0800 Subject: [PATCH 10/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2418c01269..a9640c1401 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ ### 重要信息 -1. **2020-11-29 发布 [【4.0.0正式版】](https://mp.weixin.qq.com/s/xkT7P79SVwkpk85d-2fCUw)**! +1. **2020-11-29 发布 [【4.0.0正式版】](https://mp.weixin.qq.com/s/OPoICwLifOZGVN_ZX_BBhw)**! 1. 新手重要提示:本项目仅是一个SDK开发工具包,未提供Web实现,建议使用 `maven` 或 `gradle` 引用本项目即可使用本SDK提供的各种功能,详情可参考 **[【Demo项目】](demo.md)** 或本项目中的部分单元测试代码;另外微信开发新手请务必阅读[【开发文档 Wiki 首页】](https://github.com/Wechat-Group/WxJava/wiki)的常见问题部分,可以少走很多弯路,节省不少时间。 1. 技术交流群:想获得QQ群/微信群/钉钉企业群等信息的同学,请使用微信扫描上面的微信公众号二维码关注 `WxJava` 后点击相关菜单即可获取加入方式,同时也可以在微信中搜索 `weixin-java-tools` 或 `WxJava` 后选择正确的公众号进行关注,该公众号会及时通知SDK相关更新信息,并不定期分享微信Java开发相关技术知识; 1. 付费QQ群:(**注意:刚入群会有5分钟禁言,稍等片刻即可正常发言**) [![加入QQ群](https://img.shields.io/badge/QQ群-343954419-blue.svg)](http://shang.qq.com/wpa/qunwpa?idkey=731dc3e7ea31ebe25376cc1a791445468612c63fd0e9e05399b088ec81fd9e15) 或 [![加入QQ群](https://img.shields.io/badge/QQ群-343954419-blue.svg)](http://jq.qq.com/?_wv=1027&k=40lRskK),或者请自行搜索群号`343954419`进行添加;当然由于某种原因无法入群的,可关注公众号后获取其他群的加入方式; From 8f3fa1dd7ca60f2d39aba28526a68ec454b9c5b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Dec 2020 13:40:40 +0800 Subject: [PATCH 11/12] :arrow_up: Bump jetty.version from 9.4.31.v20200723 to 9.4.35.v20201120 (#1905) Bumps `jetty.version` from 9.4.31.v20200723 to 9.4.35.v20201120. Updates `jetty-server` from 9.4.31.v20200723 to 9.4.35.v20201120 - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-9.4.31.v20200723...jetty-9.4.35.v20201120) Updates `jetty-servlet` from 9.4.31.v20200723 to 9.4.35.v20201120 - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-9.4.31.v20200723...jetty-9.4.35.v20201120) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7118281d00..89255baa73 100644 --- a/pom.xml +++ b/pom.xml @@ -121,7 +121,7 @@ UTF-8 4.5 - 9.4.31.v20200723 + 9.4.35.v20201120 From 2a45fe4adecc45b637801c2157a82d118849b44f Mon Sep 17 00:00:00 2001 From: Ricky-dgs <756568809@qq.com> Date: Thu, 3 Dec 2020 16:59:08 +0800 Subject: [PATCH 12/12] =?UTF-8?q?:new:=20=20#1902=20=E3=80=90=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=A2=9E=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8A=A0=E5=85=A5=E4=BC=81=E4=B8=9A=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/cp/api/WxCpUserService.java | 17 ++++++++++++++++- .../weixin/cp/api/impl/WxCpUserServiceImpl.java | 12 +++++++++++- .../weixin/cp/constant/WxCpApiPathConsts.java | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) 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 4804dbc818..ede813a0a5 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 @@ -183,5 +183,20 @@ public interface WxCpUserService { */ WxCpExternalContactInfo getExternalContact(String userId) throws WxErrorException; - + /** + *
+   *
+   * 获取加入企业二维码。
+   *
+   * 请求方式:GET(HTTPS)
+   * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/corp/get_join_qrcode?access_token=ACCESS_TOKEN&size_type=SIZE_TYPE
+   *
+   * 文档地址:https://work.weixin.qq.com/api/doc/90000/90135/91714
+   * 
+ * + * @param sizeType qrcode尺寸类型,1: 171 x 171; 2: 399 x 399; 3: 741 x 741; 4: 2052 x 2052 + * @return join_qrcode 二维码链接,有效期7天 + * @throws WxErrorException . + */ + String getJoinQrCode(int sizeType) throws WxErrorException; } 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 cb122a0142..d0648b21ec 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 @@ -1,7 +1,9 @@ package me.chanjar.weixin.cp.api.impl; import com.google.common.collect.Maps; -import com.google.gson.*; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; @@ -198,4 +200,12 @@ public WxCpExternalContactInfo getExternalContact(String userId) throws WxErrorE String responseContent = this.mainService.get(url, null); return WxCpExternalContactInfo.fromJson(responseContent); } + + @Override + public String getJoinQrCode(int sizeType) throws WxErrorException { + String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_JOIN_QR_CODE + sizeType); + String responseContent = this.mainService.get(url, null); + JsonObject tmpJson = GsonParser.parse(responseContent); + return tmpJson.get("join_qrcode").getAsString(); + } } 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 f1e1902e05..bac4dd96e4 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 @@ -161,6 +161,7 @@ public static class User { public static final String USER_CONVERT_TO_USERID = "/cgi-bin/user/convert_to_userid"; public static final String GET_USER_ID = "/cgi-bin/user/getuserid"; public static final String GET_EXTERNAL_CONTACT = "/cgi-bin/crm/get_external_contact?external_userid="; + public static final String GET_JOIN_QR_CODE = "/cgi-bin/corp/get_join_qrcode?size_type="; } @UtilityClass