@@ -6,7 +6,7 @@ import java.util.Map; | |||||
/** | /** | ||||
* 微信开发所使用到的常量类. | * 微信开发所使用到的常量类. | ||||
* | * | ||||
* @author chanjarster & binarywang | |||||
* @author Daniel Qian & binarywang | |||||
*/ | */ | ||||
public class WxConsts { | public class WxConsts { | ||||
/** | /** | ||||
@@ -4,6 +4,8 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||||
/** | /** | ||||
* WxErrorException处理器. | * WxErrorException处理器. | ||||
* | |||||
* @author Daniel Qian | |||||
*/ | */ | ||||
public interface WxErrorExceptionHandler { | public interface WxErrorExceptionHandler { | ||||
@@ -5,6 +5,8 @@ package me.chanjar.weixin.common.api; | |||||
* 消息重复检查器. | * 消息重复检查器. | ||||
* 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 | * 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 | ||||
* </pre> | * </pre> | ||||
* | |||||
* @author Daniel Qian | |||||
*/ | */ | ||||
public interface WxMessageDuplicateChecker { | public interface WxMessageDuplicateChecker { | ||||
@@ -9,6 +9,8 @@ import java.util.concurrent.atomic.AtomicBoolean; | |||||
* 默认消息重复检查器. | * 默认消息重复检查器. | ||||
* 将每个消息id保存在内存里,每隔5秒清理已经过期的消息id,每个消息id的过期时间是15秒 | * 将每个消息id保存在内存里,每隔5秒清理已经过期的消息id,每个消息id的过期时间是15秒 | ||||
* </pre> | * </pre> | ||||
* | |||||
* @author Daniel Qian | |||||
*/ | */ | ||||
public class WxMessageInMemoryDuplicateChecker implements WxMessageDuplicateChecker { | public class WxMessageInMemoryDuplicateChecker implements WxMessageDuplicateChecker { | ||||
@@ -1,10 +1,15 @@ | |||||
package me.chanjar.weixin.common.bean; | package me.chanjar.weixin.common.bean; | ||||
import java.io.Serializable; | |||||
import lombok.Data; | import lombok.Data; | ||||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
import java.io.Serializable; | |||||
/** | |||||
* access token. | |||||
* | |||||
* @author Daniel Qian | |||||
*/ | |||||
@Data | @Data | ||||
public class WxAccessToken implements Serializable { | public class WxAccessToken implements Serializable { | ||||
private static final long serialVersionUID = 8709719312922168909L; | private static final long serialVersionUID = 8709719312922168909L; | ||||
@@ -1,16 +1,16 @@ | |||||
package me.chanjar.weixin.common.bean; | package me.chanjar.weixin.common.bean; | ||||
import java.io.Serializable; | |||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import lombok.Builder; | import lombok.Builder; | ||||
import lombok.Data; | import lombok.Data; | ||||
import lombok.NoArgsConstructor; | import lombok.NoArgsConstructor; | ||||
import java.io.Serializable; | |||||
/** | /** | ||||
* jspai signature. | * jspai signature. | ||||
* | * | ||||
* @author chanjarster | |||||
* @author Daniel Qian | |||||
*/ | */ | ||||
@Data | @Data | ||||
@Builder | @Builder | ||||
@@ -10,6 +10,11 @@ import org.apache.commons.lang3.builder.ToStringStyle; | |||||
import com.google.gson.annotations.SerializedName; | import com.google.gson.annotations.SerializedName; | ||||
import lombok.Data; | import lombok.Data; | ||||
/** | |||||
* menu button. | |||||
* | |||||
* @author Daniel Qian | |||||
*/ | |||||
@Data | @Data | ||||
public class WxMenuButton implements Serializable { | public class WxMenuButton implements Serializable { | ||||
private static final long serialVersionUID = -1070939403109776555L; | private static final long serialVersionUID = -1070939403109776555L; | ||||
@@ -8,6 +8,11 @@ import org.apache.commons.lang3.builder.ToStringStyle; | |||||
import com.google.gson.annotations.SerializedName; | import com.google.gson.annotations.SerializedName; | ||||
import lombok.Data; | import lombok.Data; | ||||
/** | |||||
* menu rule. | |||||
* | |||||
* @author Daniel Qian | |||||
*/ | |||||
@Data | @Data | ||||
public class WxMenuRule implements Serializable { | public class WxMenuRule implements Serializable { | ||||
private static final long serialVersionUID = -4587181819499286670L; | private static final long serialVersionUID = -4587181819499286670L; | ||||
@@ -8,6 +8,10 @@ import org.apache.commons.lang3.builder.ToStringStyle; | |||||
import lombok.Data; | import lombok.Data; | ||||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
/** | |||||
* | |||||
* @author Daniel Qian | |||||
*/ | |||||
@Data | @Data | ||||
public class WxMediaUploadResult implements Serializable { | public class WxMediaUploadResult implements Serializable { | ||||
private static final long serialVersionUID = 330834334738622341L; | private static final long serialVersionUID = 330834334738622341L; | ||||
@@ -1,5 +1,9 @@ | |||||
package me.chanjar.weixin.common.session; | package me.chanjar.weixin.common.session; | ||||
/** | |||||
* | |||||
* @author Daniel Qian | |||||
*/ | |||||
public interface InternalSession { | public interface InternalSession { | ||||
/** | /** | ||||
@@ -1,5 +1,8 @@ | |||||
package me.chanjar.weixin.common.session; | package me.chanjar.weixin.common.session; | ||||
/** | |||||
* @author Daniel Qian | |||||
*/ | |||||
public interface InternalSessionManager { | public interface InternalSessionManager { | ||||
/** | /** | ||||
@@ -1,11 +1,18 @@ | |||||
package me.chanjar.weixin.common.session; | package me.chanjar.weixin.common.session; | ||||
import me.chanjar.weixin.common.util.res.StringManager; | |||||
import java.util.*; | |||||
import java.util.Collections; | |||||
import java.util.Enumeration; | |||||
import java.util.HashSet; | |||||
import java.util.Map; | |||||
import java.util.Set; | |||||
import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||
import java.util.concurrent.atomic.AtomicInteger; | import java.util.concurrent.atomic.AtomicInteger; | ||||
import me.chanjar.weixin.common.util.res.StringManager; | |||||
/** | |||||
* @author Daniel Qian | |||||
*/ | |||||
public class StandardSession implements WxSession, InternalSession { | public class StandardSession implements WxSession, InternalSession { | ||||
/** | /** | ||||
@@ -2,6 +2,9 @@ package me.chanjar.weixin.common.session; | |||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
/** | |||||
* @author Daniel Qian | |||||
*/ | |||||
public class StandardSessionFacade implements WxSession { | public class StandardSessionFacade implements WxSession { | ||||
/** | /** | ||||
@@ -1,15 +1,18 @@ | |||||
package me.chanjar.weixin.common.session; | package me.chanjar.weixin.common.session; | ||||
import me.chanjar.weixin.common.util.res.StringManager; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||
import java.util.concurrent.atomic.AtomicBoolean; | import java.util.concurrent.atomic.AtomicBoolean; | ||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import me.chanjar.weixin.common.util.res.StringManager; | |||||
/** | /** | ||||
* 基于内存的session manager | |||||
* 基于内存的session manager. | |||||
* | |||||
* @author Daniel Qian | |||||
*/ | */ | ||||
public class StandardSessionManager implements WxSessionManager, InternalSessionManager { | public class StandardSessionManager implements WxSessionManager, InternalSessionManager { | ||||
@@ -19,6 +19,8 @@ package me.chanjar.weixin.common.session; | |||||
/** | /** | ||||
* An exception that indicates the maximum number of active sessions has been | * An exception that indicates the maximum number of active sessions has been | ||||
* reached and the server is refusing to create any new sessions. | * reached and the server is refusing to create any new sessions. | ||||
* | |||||
* @author Daniel Qian | |||||
*/ | */ | ||||
public class TooManyActiveSessionsException | public class TooManyActiveSessionsException | ||||
extends IllegalStateException { | extends IllegalStateException { | ||||
@@ -2,6 +2,9 @@ package me.chanjar.weixin.common.session; | |||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
/** | |||||
* @author Daniel Qian | |||||
*/ | |||||
public interface WxSession { | public interface WxSession { | ||||
Object getAttribute(String name); | Object getAttribute(String name); | ||||
@@ -1,5 +1,8 @@ | |||||
package me.chanjar.weixin.common.session; | package me.chanjar.weixin.common.session; | ||||
/** | |||||
* @author Daniel Qian | |||||
*/ | |||||
public interface WxSessionManager { | public interface WxSessionManager { | ||||
/** | /** | ||||
@@ -13,6 +13,7 @@ import org.apache.commons.lang3.builder.ToStringStyle; | |||||
import com.thoughtworks.xstream.annotations.XStreamAlias; | import com.thoughtworks.xstream.annotations.XStreamAlias; | ||||
import com.thoughtworks.xstream.annotations.XStreamConverter; | import com.thoughtworks.xstream.annotations.XStreamConverter; | ||||
import lombok.Data; | import lombok.Data; | ||||
import lombok.extern.slf4j.Slf4j; | |||||
import me.chanjar.weixin.common.api.WxConsts; | import me.chanjar.weixin.common.api.WxConsts; | ||||
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | ||||
import me.chanjar.weixin.cp.config.WxCpConfigStorage; | import me.chanjar.weixin.cp.config.WxCpConfigStorage; | ||||
@@ -29,8 +30,9 @@ import me.chanjar.weixin.cp.util.xml.XStreamTransformer; | |||||
* | * | ||||
* @author Daniel Qian | * @author Daniel Qian | ||||
*/ | */ | ||||
@XStreamAlias("xml") | |||||
@Data | @Data | ||||
@Slf4j | |||||
@XStreamAlias("xml") | |||||
public class WxCpXmlMessage implements Serializable { | public class WxCpXmlMessage implements Serializable { | ||||
private static final long serialVersionUID = -1042994982179476410L; | private static final long serialVersionUID = -1042994982179476410L; | ||||
@@ -52,6 +54,24 @@ public class WxCpXmlMessage implements Serializable { | |||||
@XStreamAlias("CreateTime") | @XStreamAlias("CreateTime") | ||||
private Long createTime; | private Long createTime; | ||||
/** | |||||
* <pre> | |||||
* 当接受用户消息时,可能会获得以下值: | |||||
* {@link WxConsts.XmlMsgType#TEXT} | |||||
* {@link WxConsts.XmlMsgType#IMAGE} | |||||
* {@link WxConsts.XmlMsgType#VOICE} | |||||
* {@link WxConsts.XmlMsgType#VIDEO} | |||||
* {@link WxConsts.XmlMsgType#LOCATION} | |||||
* {@link WxConsts.XmlMsgType#LINK} | |||||
* {@link WxConsts.XmlMsgType#EVENT} | |||||
* 当发送消息的时候使用: | |||||
* {@link WxConsts.XmlMsgType#TEXT} | |||||
* {@link WxConsts.XmlMsgType#IMAGE} | |||||
* {@link WxConsts.XmlMsgType#VOICE} | |||||
* {@link WxConsts.XmlMsgType#VIDEO} | |||||
* {@link WxConsts.XmlMsgType#NEWS} | |||||
* </pre> | |||||
*/ | |||||
@XStreamAlias("MsgType") | @XStreamAlias("MsgType") | ||||
@XStreamConverter(value = XStreamCDataConverter.class) | @XStreamConverter(value = XStreamCDataConverter.class) | ||||
private String msgType; | private String msgType; | ||||
@@ -339,19 +359,16 @@ public class WxCpXmlMessage implements Serializable { | |||||
/** | /** | ||||
* 从加密字符串转换. | * 从加密字符串转换. | ||||
*/ | */ | ||||
public static WxCpXmlMessage fromEncryptedXml( | |||||
String encryptedXml, | |||||
WxCpConfigStorage wxCpConfigStorage, | |||||
String timestamp, String nonce, String msgSignature) { | |||||
public static WxCpXmlMessage fromEncryptedXml(String encryptedXml, WxCpConfigStorage wxCpConfigStorage, | |||||
String timestamp, String nonce, String msgSignature) { | |||||
WxCpCryptUtil cryptUtil = new WxCpCryptUtil(wxCpConfigStorage); | WxCpCryptUtil cryptUtil = new WxCpCryptUtil(wxCpConfigStorage); | ||||
String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml); | String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml); | ||||
log.debug("解密后的原始xml消息内容:{}", plainText); | |||||
return fromXml(plainText); | return fromXml(plainText); | ||||
} | } | ||||
public static WxCpXmlMessage fromEncryptedXml( | |||||
InputStream is, | |||||
WxCpConfigStorage wxCpConfigStorage, | |||||
String timestamp, String nonce, String msgSignature) { | |||||
public static WxCpXmlMessage fromEncryptedXml(InputStream is, WxCpConfigStorage wxCpConfigStorage, | |||||
String timestamp, String nonce, String msgSignature) { | |||||
try { | try { | ||||
return fromEncryptedXml(IOUtils.toString(is, "UTF-8"), wxCpConfigStorage, timestamp, nonce, msgSignature); | return fromEncryptedXml(IOUtils.toString(is, "UTF-8"), wxCpConfigStorage, timestamp, nonce, msgSignature); | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
@@ -359,36 +376,6 @@ public class WxCpXmlMessage implements Serializable { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* <pre> | |||||
* 当接受用户消息时,可能会获得以下值: | |||||
* {@link WxConsts.XmlMsgType#TEXT} | |||||
* {@link WxConsts.XmlMsgType#IMAGE} | |||||
* {@link WxConsts.XmlMsgType#VOICE} | |||||
* {@link WxConsts.XmlMsgType#VIDEO} | |||||
* {@link WxConsts.XmlMsgType#LOCATION} | |||||
* {@link WxConsts.XmlMsgType#LINK} | |||||
* {@link WxConsts.XmlMsgType#EVENT} | |||||
* </pre> | |||||
*/ | |||||
public String getMsgType() { | |||||
return this.msgType; | |||||
} | |||||
/** | |||||
* <pre> | |||||
* 当发送消息的时候使用: | |||||
* {@link WxConsts.XmlMsgType#TEXT} | |||||
* {@link WxConsts.XmlMsgType#IMAGE} | |||||
* {@link WxConsts.XmlMsgType#VOICE} | |||||
* {@link WxConsts.XmlMsgType#VIDEO} | |||||
* {@link WxConsts.XmlMsgType#NEWS} | |||||
* </pre> | |||||
*/ | |||||
public void setMsgType(String msgType) { | |||||
this.msgType = msgType; | |||||
} | |||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | ||||
@@ -1,6 +1,16 @@ | |||||
package me.chanjar.weixin.cp.demo; | package me.chanjar.weixin.cp.demo; | ||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.Map; | |||||
import org.eclipse.jetty.server.Server; | |||||
import org.eclipse.jetty.servlet.ServletHandler; | |||||
import org.eclipse.jetty.servlet.ServletHolder; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
import me.chanjar.weixin.cp.WxCpConsts; | |||||
import me.chanjar.weixin.cp.api.WxCpService; | import me.chanjar.weixin.cp.api.WxCpService; | ||||
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; | import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; | ||||
import me.chanjar.weixin.cp.bean.WxCpXmlMessage; | import me.chanjar.weixin.cp.bean.WxCpXmlMessage; | ||||
@@ -9,13 +19,6 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutTextMessage; | |||||
import me.chanjar.weixin.cp.config.WxCpConfigStorage; | import me.chanjar.weixin.cp.config.WxCpConfigStorage; | ||||
import me.chanjar.weixin.cp.message.WxCpMessageHandler; | import me.chanjar.weixin.cp.message.WxCpMessageHandler; | ||||
import me.chanjar.weixin.cp.message.WxCpMessageRouter; | import me.chanjar.weixin.cp.message.WxCpMessageRouter; | ||||
import org.eclipse.jetty.server.Server; | |||||
import org.eclipse.jetty.servlet.ServletHandler; | |||||
import org.eclipse.jetty.servlet.ServletHolder; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.util.Map; | |||||
public class WxCpDemoServer { | public class WxCpDemoServer { | ||||
@@ -78,9 +81,26 @@ public class WxCpDemoServer { | |||||
}; | }; | ||||
wxCpMessageRouter = new WxCpMessageRouter(wxCpService); | wxCpMessageRouter = new WxCpMessageRouter(wxCpService); | ||||
wxCpMessageRouter.rule().async(false).content("哈哈") // 拦截内容为“哈哈”的消息 | |||||
.handler(handler).end().rule().async(false).content("oauth") | |||||
.handler(oauth2handler).end(); | |||||
wxCpMessageRouter.rule() | |||||
.async(false) | |||||
.content("哈哈") // 拦截内容为“哈哈”的消息 | |||||
.handler(handler) | |||||
.end() | |||||
.rule() | |||||
.async(false) | |||||
.content("oauth") | |||||
.handler(oauth2handler) | |||||
.end() | |||||
.rule() | |||||
.event(WxCpConsts.EventType.CHANGE_CONTACT) | |||||
.handler(new WxCpMessageHandler() { | |||||
@Override | |||||
public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService wxCpService, WxSessionManager sessionManager) throws WxErrorException { | |||||
System.out.println("通讯录发生变更"); | |||||
return null; | |||||
} | |||||
}) | |||||
.end(); | |||||
} | } | ||||
} | } | ||||
@@ -11,6 +11,7 @@ import org.apache.commons.lang3.builder.ToStringStyle; | |||||
import com.thoughtworks.xstream.annotations.XStreamAlias; | import com.thoughtworks.xstream.annotations.XStreamAlias; | ||||
import com.thoughtworks.xstream.annotations.XStreamConverter; | import com.thoughtworks.xstream.annotations.XStreamConverter; | ||||
import lombok.Data; | import lombok.Data; | ||||
import lombok.extern.slf4j.Slf4j; | |||||
import me.chanjar.weixin.common.api.WxConsts; | import me.chanjar.weixin.common.api.WxConsts; | ||||
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | ||||
import me.chanjar.weixin.mp.api.WxMpConfigStorage; | import me.chanjar.weixin.mp.api.WxMpConfigStorage; | ||||
@@ -27,8 +28,9 @@ import me.chanjar.weixin.mp.util.xml.XStreamTransformer; | |||||
* | * | ||||
* @author chanjarster | * @author chanjarster | ||||
*/ | */ | ||||
@XStreamAlias("xml") | |||||
@Data | @Data | ||||
@Slf4j | |||||
@XStreamAlias("xml") | |||||
public class WxMpXmlMessage implements Serializable { | public class WxMpXmlMessage implements Serializable { | ||||
private static final long serialVersionUID = -3586245291677274914L; | private static final long serialVersionUID = -3586245291677274914L; | ||||
@@ -482,10 +484,11 @@ public class WxMpXmlMessage implements Serializable { | |||||
* @param nonce 随机串 | * @param nonce 随机串 | ||||
* @param msgSignature 签名串 | * @param msgSignature 签名串 | ||||
*/ | */ | ||||
public static WxMpXmlMessage fromEncryptedXml(String encryptedXml, WxMpConfigStorage wxMpConfigStorage, String timestamp, | |||||
String nonce, String msgSignature) { | |||||
public static WxMpXmlMessage fromEncryptedXml(String encryptedXml, WxMpConfigStorage wxMpConfigStorage, | |||||
String timestamp, String nonce, String msgSignature) { | |||||
WxMpCryptUtil cryptUtil = new WxMpCryptUtil(wxMpConfigStorage); | WxMpCryptUtil cryptUtil = new WxMpCryptUtil(wxMpConfigStorage); | ||||
String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml); | String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml); | ||||
log.debug("解密后的原始xml消息内容:{}", plainText); | |||||
return fromXml(plainText); | return fromXml(plainText); | ||||
} | } | ||||
@@ -1,25 +1,28 @@ | |||||
package me.chanjar.weixin.open.bean.message; | package me.chanjar.weixin.open.bean.message; | ||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.io.Serializable; | |||||
import org.apache.commons.io.IOUtils; | |||||
import com.thoughtworks.xstream.annotations.XStreamAlias; | import com.thoughtworks.xstream.annotations.XStreamAlias; | ||||
import com.thoughtworks.xstream.annotations.XStreamConverter; | import com.thoughtworks.xstream.annotations.XStreamConverter; | ||||
import lombok.Data; | import lombok.Data; | ||||
import lombok.extern.slf4j.Slf4j; | |||||
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | ||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | ||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; | ||||
import me.chanjar.weixin.open.api.WxOpenConfigStorage; | import me.chanjar.weixin.open.api.WxOpenConfigStorage; | ||||
import me.chanjar.weixin.open.util.WxOpenCryptUtil; | import me.chanjar.weixin.open.util.WxOpenCryptUtil; | ||||
import me.chanjar.weixin.open.util.xml.XStreamTransformer; | import me.chanjar.weixin.open.util.xml.XStreamTransformer; | ||||
import org.apache.commons.io.IOUtils; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.io.Serializable; | |||||
/** | /** | ||||
* @author <a href="https://github.com/007gzs">007</a> | * @author <a href="https://github.com/007gzs">007</a> | ||||
*/ | */ | ||||
@XStreamAlias("xml") | |||||
@Data | @Data | ||||
@Slf4j | |||||
@XStreamAlias("xml") | |||||
public class WxOpenXmlMessage implements Serializable { | public class WxOpenXmlMessage implements Serializable { | ||||
private static final long serialVersionUID = -5641769554709507771L; | private static final long serialVersionUID = -5641769554709507771L; | ||||
@@ -78,30 +81,26 @@ public class WxOpenXmlMessage implements Serializable { | |||||
* @param nonce 随机串 | * @param nonce 随机串 | ||||
* @param msgSignature 签名串 | * @param msgSignature 签名串 | ||||
*/ | */ | ||||
public static WxOpenXmlMessage fromEncryptedXml(String encryptedXml, | |||||
WxOpenConfigStorage wxOpenConfigStorage, String timestamp, String nonce, | |||||
String msgSignature) { | |||||
public static WxOpenXmlMessage fromEncryptedXml(String encryptedXml, WxOpenConfigStorage wxOpenConfigStorage, | |||||
String timestamp, String nonce, String msgSignature) { | |||||
WxOpenCryptUtil cryptUtil = new WxOpenCryptUtil(wxOpenConfigStorage); | WxOpenCryptUtil cryptUtil = new WxOpenCryptUtil(wxOpenConfigStorage); | ||||
String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, | |||||
encryptedXml); | |||||
String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml); | |||||
log.debug("解密后的原始xml消息内容:{}", plainText); | |||||
return fromXml(plainText); | return fromXml(plainText); | ||||
} | } | ||||
public static WxMpXmlMessage fromEncryptedMpXml(String encryptedXml, | |||||
WxOpenConfigStorage wxOpenConfigStorage, String timestamp, String nonce, | |||||
String msgSignature) { | |||||
public static WxMpXmlMessage fromEncryptedMpXml(String encryptedXml, WxOpenConfigStorage wxOpenConfigStorage, | |||||
String timestamp, String nonce, String msgSignature) { | |||||
WxOpenCryptUtil cryptUtil = new WxOpenCryptUtil(wxOpenConfigStorage); | WxOpenCryptUtil cryptUtil = new WxOpenCryptUtil(wxOpenConfigStorage); | ||||
String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, | |||||
encryptedXml); | |||||
String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml); | |||||
return WxMpXmlMessage.fromXml(plainText); | return WxMpXmlMessage.fromXml(plainText); | ||||
} | } | ||||
public static WxOpenXmlMessage fromEncryptedXml(InputStream is, | |||||
WxOpenConfigStorage wxOpenConfigStorage, String timestamp, String nonce, | |||||
String msgSignature) { | |||||
public static WxOpenXmlMessage fromEncryptedXml(InputStream is, WxOpenConfigStorage wxOpenConfigStorage, | |||||
String timestamp, String nonce, String msgSignature) { | |||||
try { | try { | ||||
return fromEncryptedXml(IOUtils.toString(is, "UTF-8"), wxOpenConfigStorage, | |||||
timestamp, nonce, msgSignature); | |||||
return fromEncryptedXml(IOUtils.toString(is, "UTF-8"), | |||||
wxOpenConfigStorage, timestamp, nonce, msgSignature); | |||||
} catch (IOException e) { | } catch (IOException e) { | ||||
throw new RuntimeException(e); | throw new RuntimeException(e); | ||||
} | } | ||||