package com.ynxbd.wx.wxfactory.menu.bean.xml; import com.qq.weixin.mp.aes.WXBizMsgCrypt; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamConverter; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import com.ynxbd.wx.config.WeChatConfig; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import org.apache.commons.io.IOUtils; @Setter @Getter @NoArgsConstructor @ToString @XStreamAlias("xml") public class WxXmlMessage { @XStreamAlias("ToUserName") @XStreamConverter(XStreamCDataConverter.class) private String toUserName; @XStreamAlias("FromUserName") @XStreamConverter(XStreamCDataConverter.class) private String fromUserName; @XStreamAlias("CreateTime") private Long createTime; @XStreamAlias("MsgType") @XStreamConverter(XStreamCDataConverter.class) private String msgType; @XStreamAlias("Content") @XStreamConverter(XStreamCDataConverter.class) private String content; @XStreamAlias("MsgId") private Long msgId; @XStreamAlias("PicUrl") @XStreamConverter(XStreamCDataConverter.class) private String picUrl; @XStreamAlias("MediaId") @XStreamConverter(XStreamCDataConverter.class) private String mediaId; @XStreamAlias("Format") @XStreamConverter(XStreamCDataConverter.class) private String format; @XStreamAlias("ThumbMediaId") @XStreamConverter(XStreamCDataConverter.class) private String thumbMediaId; @XStreamAlias("Location_X") private Double locationX; @XStreamAlias("Location_Y") private Double locationY; @XStreamAlias("Scale") private Double scale; @XStreamAlias("Label") @XStreamConverter(XStreamCDataConverter.class) private String label; @XStreamAlias("Title") @XStreamConverter(XStreamCDataConverter.class) private String title; @XStreamAlias("Description") @XStreamConverter(XStreamCDataConverter.class) private String description; @XStreamAlias("Url") @XStreamConverter(XStreamCDataConverter.class) private String url; @XStreamAlias("Event") @XStreamConverter(XStreamCDataConverter.class) private String event; @XStreamAlias("EventKey") @XStreamConverter(XStreamCDataConverter.class) private String eventKey; @XStreamAlias("Ticket") @XStreamConverter(XStreamCDataConverter.class) private String ticket; @XStreamAlias("Latitude") private Double latitude; @XStreamAlias("Longitude") private Double longitude; @XStreamAlias("Precision") private Double precision; @XStreamAlias("Recognition") @XStreamConverter(XStreamCDataConverter.class) private String recognition; @XStreamAlias("ExpiredTime") private String expiredTime; @XStreamAlias("FailTime") private String failTime; @XStreamAlias("FailReason") @XStreamConverter(XStreamCDataConverter.class) private String failReason; @XStreamAlias("TransInfo") private WxKf kf; @XStreamAlias("KfAccount") @XStreamConverter(XStreamCDataConverter.class) private String kfAccount; @XStreamAlias("FromKfAccount") @XStreamConverter(XStreamCDataConverter.class) private String fromKfAccount; @XStreamAlias("ToKfAccount") @XStreamConverter(XStreamCDataConverter.class) private String toKfAccount; @XStreamAlias("Status") @XStreamConverter(XStreamCDataConverter.class) private String status; @XStreamAlias("TotalCount") private Integer totalCount; @XStreamAlias("FilterCount") private Integer filterCount; @XStreamAlias("SentCount") private Integer sentCount; @XStreamAlias("ErrorCount") private Integer errorCount; @XStreamAlias("ScanCodeInfo") private ScanCodeInfo scanCodeInfo = new ScanCodeInfo(); @XStreamAlias("SendPicsInfo") private SendPicsInfo sendPicsInfo = new SendPicsInfo(); @XStreamAlias("SendLocationInfo") private SendLocationInfo sendLocationInfo = new SendLocationInfo(); protected static WxXmlMessage fromXml(String xml) { return XStreamTransformer.fromXml(WxXmlMessage.class, xml); } protected static WxXmlMessage fromXml(InputStream is) { return XStreamTransformer.fromXml(WxXmlMessage.class, is); } public static WxXmlMessage decryptMsg(String encryptedXml, String timestamp, String nonce, String msgSignature) throws Exception { WXBizMsgCrypt pc = new WXBizMsgCrypt(WeChatConfig.TOKEN, WeChatConfig.AES_KEY, WeChatConfig.APP_ID); String plainText = pc.decryptMsg(msgSignature, timestamp, nonce, encryptedXml); return fromXml(plainText); } public static WxXmlMessage decryptMsg(InputStream is, String timestamp, String nonce, String msgSignature) throws Exception { try { return decryptMsg(IOUtils.toString(is, StandardCharsets.UTF_8), timestamp, nonce, msgSignature); } catch (IOException var6) { throw new RuntimeException(var6); } } @Setter @Getter @NoArgsConstructor @ToString @XStreamAlias("SendLocationInfo") public static class SendLocationInfo { @XStreamAlias("Location_X") @XStreamConverter(XStreamCDataConverter.class) private String locationX; @XStreamAlias("Location_Y") @XStreamConverter(XStreamCDataConverter.class) private String locationY; @XStreamAlias("Scale") @XStreamConverter(XStreamCDataConverter.class) private String scale; @XStreamAlias("Label") @XStreamConverter(XStreamCDataConverter.class) private String label; @XStreamAlias("Poiname") @XStreamConverter(XStreamCDataConverter.class) private String poiname; } @Setter @Getter @NoArgsConstructor @ToString @XStreamAlias("SendPicsInfo") public static class SendPicsInfo { @XStreamAlias("Count") private Long count; @XStreamAlias("PicList") protected final List picList = new ArrayList<>(); @Setter @Getter @NoArgsConstructor @ToString @XStreamAlias("item") public static class Item { @XStreamAlias("PicMd5Sum") @XStreamConverter(XStreamCDataConverter.class) private String PicMd5Sum; } } @Setter @Getter @NoArgsConstructor @ToString @XStreamAlias("ScanCodeInfo") public static class ScanCodeInfo { @XStreamAlias("ScanType") @XStreamConverter(XStreamCDataConverter.class) private String scanType; @XStreamAlias("ScanResult") @XStreamConverter(XStreamCDataConverter.class) private String scanResult; } @Setter @Getter @NoArgsConstructor @ToString public static class WxKf { @XStreamAlias("KfAccount") @XStreamConverter(XStreamCDataConverter.class) private String kfAccount; } }