diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
index a1e3c073..c4bac2a8 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
@@ -250,6 +250,15 @@ public class WxConsts {
*/
public static final String CARD_PAY_ORDER = "card_pay_order";
+ /**
+ * 小程序审核事件:审核通过
+ */
+ public static final String WEAPP_AUDIT_SUCCESS = "weapp_audit_success";
+
+ /**
+ * 小程序审核事件:审核不通过
+ */
+ public static final String WEAPP_AUDIT_FAIL = "weapp_audit_fail";
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateChecker.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateChecker.java
index c0f57c83..d7ac36c7 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateChecker.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateChecker.java
@@ -76,7 +76,7 @@ public class WxMessageInMemoryDuplicateChecker implements WxMessageDuplicateChec
}
}
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
}
});
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java
index 17d8ab9f..0b9f689b 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java
@@ -2,10 +2,8 @@ package me.chanjar.weixin.common.bean;
import java.io.Serializable;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
/**
* 卡券Api签名.
@@ -37,6 +35,6 @@ public class WxCardApiSignature implements Serializable {
@Override
public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+ return WxGsonBuilder.create().toJson(this);
}
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java
index 8b43646a..ab000733 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenu.java
@@ -7,9 +7,6 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
import lombok.Data;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
@@ -49,7 +46,7 @@ public class WxMenu implements Serializable {
@Override
public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+ return this.toJson();
}
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java
index 5e0b9db9..114e267d 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java
@@ -4,11 +4,9 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
import com.google.gson.annotations.SerializedName;
import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
/**
* menu button.
@@ -83,7 +81,7 @@ public class WxMenuButton implements Serializable {
@Override
public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+ return WxGsonBuilder.create().toJson(this);
}
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
index 632279b9..49d4e891 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
@@ -2,11 +2,9 @@ package me.chanjar.weixin.common.bean.menu;
import java.io.Serializable;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
import com.google.gson.annotations.SerializedName;
import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
/**
* menu rule.
@@ -31,6 +29,6 @@ public class WxMenuRule implements Serializable {
@Override
public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+ return WxGsonBuilder.create().toJson(this);
}
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java
index d6ffd50c..a62bf3c6 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java
@@ -2,9 +2,6 @@ package me.chanjar.weixin.common.bean.result;
import java.io.Serializable;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
import lombok.Data;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
@@ -28,7 +25,7 @@ public class WxMediaUploadResult implements Serializable {
@Override
public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+ return WxGsonBuilder.create().toJson(this);
}
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java
index 0ae58062..56af9cef 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java
@@ -794,8 +794,7 @@ public enum WxCpErrorMsgEnum {
* 通过错误代码查找其中文含义.
*/
public static String findMsgByCode(int code) {
- WxCpErrorMsgEnum[] values = WxCpErrorMsgEnum.values();
- for (WxCpErrorMsgEnum value : values) {
+ for (WxCpErrorMsgEnum value : WxCpErrorMsgEnum.values()) {
if (value.code == code) {
return value.msg;
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java
index fc9b624f..731592ea 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java
@@ -64,6 +64,11 @@ public class WxError implements Serializable {
if (msg != null) {
wxError.setErrorMsg(msg);
}
+ } else if (type == WxType.MiniApp) {
+ final String msg = WxMaErrorMsgEnum.findMsgByCode(wxError.getErrorCode());
+ if (msg != null) {
+ wxError.setErrorMsg(msg);
+ }
}
return wxError;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java
new file mode 100644
index 00000000..3423bb2e
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java
@@ -0,0 +1,253 @@
+package me.chanjar.weixin.common.error;
+
+import lombok.Getter;
+
+/**
+ * 微信小程序错误码
+ *
+ * @author biggates
+ */
+@Getter
+public enum WxMaErrorMsgEnum {
+ /**
+ *
+ * 获取 access_token 时 AppSecret 错误,
+ * 或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的小程序调用接口
+ * 对应操作:sendCustomerMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
+ *
+ */
+ CODE_40001(40001, "access_token 无效或 AppSecret 错误"),
+ /**
+ *
+ * 不合法的凭证类型
+ * 对应操作:sendCustomerMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
+ *
+ */
+ CODE_40002(40002, "不合法的凭证类型"),
+ /**
+ *
+ * touser不是正确的openid.
+ * 对应操作:sendCustomerMessage
, sendUniformMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
+ *
+ */
+ CODE_40003(40003, "openid 不正确"),
+ /**
+ *
+ * 无效媒体文件类型
+ * 对应操作:uploadTempMedia
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/uploadTempMedia.html
+ *
+ */
+ CODE_40004(40004, "无效媒体文件类型"),
+ /**
+ *
+ * 无效媒体文件 ID.
+ * 对应操作:getTempMedia
+ * 对应地址:
+ * GET https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/getTempMedia.html
+ *
+ */
+ CODE_40007(40007, "无效媒体文件 ID"),
+ /**
+ *
+ * appid不正确,或者不符合绑定关系要求.
+ * 对应操作:sendUniformMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
+ *
+ */
+ CODE_40013(40013, "appid不正确,或者不符合绑定关系要求"),
+ /**
+ *
+ * template_id 不正确.
+ * 对应操作:sendUniformMessage
, sendTemplateMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
+ *
+ */
+ CODE_40037(40037, "template_id 不正确"),
+ /**
+ *
+ * form_id不正确,或者过期.
+ * 对应操作:sendUniformMessage
, sendTemplateMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
+ *
+ */
+ CODE_41028(41028, "form_id 不正确,或者过期"),
+ /**
+ *
+ * code 或 template_id 不正确.
+ * 对应操作:code2Session
, sendUniformMessage
, sendTemplateMessage
+ * 对应地址:
+ * GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/code2Session.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
+ *
+ */
+ CODE_41029(41029, "请求的参数不正确"),
+ /**
+ *
+ * form_id 已被使用,或者所传page页面不存在,或者小程序没有发布
+ * 对应操作:sendUniformMessage, getWXACodeUnlimit
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/qr-code/getWXACodeUnlimit.html
+ *
+ */
+ CODE_41030(41030, "请求的参数不正确"),
+ /**
+ *
+ * 调用分钟频率受限.
+ * 对应操作:getWXACodeUnlimit
, sendUniformMessage
, sendTemplateMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/qr-code/getWXACodeUnlimit.html
+ *
+ */
+ CODE_45009(45009, "调用分钟频率受限"),
+ /**
+ *
+ * 频率限制,每个用户每分钟100次.
+ * 对应操作:code2Session
+ * 对应地址:
+ * GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/code2Session.html
+ *
+ */
+ CODE_45011(45011, "频率限制,每个用户每分钟100次"),
+ /**
+ *
+ * 回复时间超过限制.
+ * 对应操作:sendCustomerMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
+ *
+ */
+ CODE_45015(45015, "回复时间超过限制"),
+ /**
+ *
+ * 接口调用超过限额, 或生成码个数总和到达最大个数限制.
+ * 对应操作:createWXAQRCode
, sendTemplateMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/qr-code/getWXACode.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
+ *
+ */
+ CODE_45029(45029, "接口调用超过限额"),
+ /**
+ *
+ * 客服接口下行条数超过上限.
+ * 对应操作:sendCustomerMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
+ *
+ */
+ CODE_45047(45047, "客服接口下行条数超过上限"),
+ /**
+ *
+ * command字段取值不对
+ * 对应操作:customerTyping
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/customerTyping.html
+ *
+ */
+ CODE_45072(45072, "command字段取值不对"),
+ /**
+ *
+ * 下发输入状态,需要之前30秒内跟用户有过消息交互.
+ * 对应操作:customerTyping
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/customerTyping.html
+ */
+ CODE_45080(45080, "下发输入状态,需要之前30秒内跟用户有过消息交互"),
+ /**
+ *
+ * 已经在输入状态,不可重复下发.
+ * 对应操作:customerTyping
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/customerTyping.html
+ *
+ */
+ CODE_45081(45081, "已经在输入状态,不可重复下发"),
+ /**
+ *
+ * API 功能未授权,请确认小程序已获得该接口.
+ * 对应操作:sendCustomerMessage
+ * 对应地址:
+ * POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
+ *
+ */
+ CODE_48001(48001, "API 功能未授权"),
+ /**
+ *
+ * 内容含有违法违规内容.
+ * 对应操作:imgSecCheck
, msgSecCheck
+ * 对应地址:
+ * POST https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN
+ * POST https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN
+ * 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sec-check/imgSecCheck.html
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sec-check/msgSecCheck.html
+ *
+ */
+ CODE_87014(87014, "内容含有违法违规内容");
+
+ private int code;
+ private String msg;
+
+ WxMaErrorMsgEnum(int code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+ /**
+ *
+ * 通过错误代码查找其中文含义.
+ */
+ public static String findMsgByCode(int code) {
+ for (WxMaErrorMsgEnum value : WxMaErrorMsgEnum.values()) {
+ if (value.code == code) {
+ return value.msg;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
index 3882252b..7e478606 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
@@ -642,8 +642,7 @@ public enum WxMpErrorMsgEnum {
* 通过错误代码查找其中文含义.
*/
public static String findMsgByCode(int code) {
- WxMpErrorMsgEnum[] values = WxMpErrorMsgEnum.values();
- for (WxMpErrorMsgEnum value : values) {
+ for (WxMpErrorMsgEnum value : WxMpErrorMsgEnum.values()) {
if (value.code == code) {
return value.msg;
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
index bf2e7358..2472cb44 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
@@ -196,6 +196,7 @@ public class StandardSessionManager implements WxSessionManager, InternalSession
Thread.sleep(StandardSessionManager.this.backgroundProcessorDelay * 1000L);
backgroundProcess();
} catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
StandardSessionManager.this.log.error("SessionManagerImpl.backgroundProcess error", e);
}
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/SignUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/SignUtils.java
index 9ea33b12..fc3579d4 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/SignUtils.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/SignUtils.java
@@ -1,12 +1,14 @@
package me.chanjar.weixin.common.util;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.binary.Hex;
-
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Hex;
+
+import lombok.extern.slf4j.Slf4j;
/**
*
@@ -27,9 +29,9 @@ public class SignUtils {
public static String createHmacSha256Sign(String message, String key) {
try {
Mac sha256 = Mac.getInstance("HmacSHA256");
- SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "HmacSHA256");
+ SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
sha256.init(secretKeySpec);
- byte[] bytes = sha256.doFinal(message.getBytes());
+ byte[] bytes = sha256.doFinal(message.getBytes(StandardCharsets.UTF_8));
return Hex.encodeHexString(bytes).toUpperCase();
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
SignUtils.log.error(e.getMessage(), e);
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java
new file mode 100644
index 00000000..cd3a7a98
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/XmlUtils.java
@@ -0,0 +1,96 @@
+package me.chanjar.weixin.common.util;
+
+import java.io.StringReader;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.io.SAXReader;
+import org.dom4j.tree.DefaultText;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+/**
+ *
+ * XML转换工具类.
+ * Created by Binary Wang on 2018/11/4.
+ *
+ *
+ * @author Binary Wang
+ */
+public class XmlUtils {
+
+ public static Map xml2Map(String xmlString) {
+ Map map = new HashMap<>(16);
+ try {
+ SAXReader saxReader = new SAXReader();
+ Document doc = saxReader.read(new StringReader(xmlString));
+ Element root = doc.getRootElement();
+ List elements = root.elements();
+ for (Element element : elements) {
+ map.put(element.getName(), element2MapOrString(element));
+ }
+ } catch (DocumentException e) {
+ throw new RuntimeException(e);
+ }
+
+ return map;
+ }
+
+ private static Object element2MapOrString(Element element) {
+ Map result = Maps.newHashMap();
+
+ final List content = element.content();
+ if (content.size() <= 1) {
+ return element.getText();
+ }
+
+ final Set names = names(content);
+ if (names.size() == 1) {
+ // 说明是个列表,各个子对象是相同的name
+ List