{
+
+ public OkHttpAuditMediaUploadRequestExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ @Override
+ public WxMaAuditMediaUploadResult 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 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/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
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-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-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/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
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/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/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/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/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/service/impl/EntPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EntPayServiceImpl.java
index 00e2ede652..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;
@@ -8,6 +9,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 +32,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 {
@@ -158,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();
}
-
}
/**
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 {