- * 当接受用户消息时,可能会获得以下值:
- * {@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}
- *
- */
- public String getMsgType() {
- return this.msgType;
- }
-
- /**
- *
- * 当发送消息的时候使用:
- * {@link WxConsts.XmlMsgType#TEXT}
- * {@link WxConsts.XmlMsgType#IMAGE}
- * {@link WxConsts.XmlMsgType#VOICE}
- * {@link WxConsts.XmlMsgType#VIDEO}
- * {@link WxConsts.XmlMsgType#NEWS}
- *
- */
- public void setMsgType(String msgType) {
- this.msgType = msgType;
- }
-
- @Override
- public String toString() {
- return ToStringUtils.toSimpleString(this);
- }
-
- @Data
- @XStreamAlias("ScanCodeInfo")
- public static class ScanCodeInfo {
-
- /**
- * 扫描类型,一般是qrcode.
- */
- @XStreamAlias("ScanType")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String scanType;
-
- /**
- * 扫描结果,即二维码对应的字符串信息.
- */
- @XStreamAlias("ScanResult")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String scanResult;
- }
-
- @Data
- @XStreamAlias("SendPicsInfo")
- public static class SendPicsInfo {
- @XStreamAlias("PicList")
- protected final List+ * 微信推送过来的消息,也是同步回复给用户的消息,xml格式 + * 相关字段的解释看微信开发者文档: + * http://mp.weixin.qq.com/wiki/index.php?title=接收普通消息 + * http://mp.weixin.qq.com/wiki/index.php?title=接收事件推送 + * http://mp.weixin.qq.com/wiki/index.php?title=接收语音识别结果 + *+ * + * @author Daniel Qian + */ +@XStreamAlias("xml") +@Data +public class WxCpXmlMessage implements Serializable { + private static final long serialVersionUID = -1042994982179476410L; + + /////////////////////// + // 以下都是微信推送过来的消息的xml的element所对应的属性 + /////////////////////// + + @XStreamAlias("AgentID") + private Integer agentId; + + @XStreamAlias("ToUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + private String toUserName; + + @XStreamAlias("FromUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + private String fromUserName; + + @XStreamAlias("CreateTime") + private Long createTime; + + @XStreamAlias("MsgType") + @XStreamConverter(value = XStreamCDataConverter.class) + private String msgType; + + @XStreamAlias("Content") + @XStreamConverter(value = XStreamCDataConverter.class) + private String content; + + @XStreamAlias("MsgId") + private Long msgId; + + @XStreamAlias("PicUrl") + @XStreamConverter(value = XStreamCDataConverter.class) + private String picUrl; + + @XStreamAlias("MediaId") + @XStreamConverter(value = XStreamCDataConverter.class) + private String mediaId; + + @XStreamAlias("Format") + @XStreamConverter(value = XStreamCDataConverter.class) + private String format; + + @XStreamAlias("ThumbMediaId") + @XStreamConverter(value = 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(value = XStreamCDataConverter.class) + private String label; + + @XStreamAlias("Title") + @XStreamConverter(value = XStreamCDataConverter.class) + private String title; + + @XStreamAlias("Description") + @XStreamConverter(value = XStreamCDataConverter.class) + private String description; + + @XStreamAlias("Url") + @XStreamConverter(value = XStreamCDataConverter.class) + private String url; + + @XStreamAlias("Event") + @XStreamConverter(value = XStreamCDataConverter.class) + private String event; + + @XStreamAlias("EventKey") + @XStreamConverter(value = XStreamCDataConverter.class) + private String eventKey; + + @XStreamAlias("Ticket") + @XStreamConverter(value = XStreamCDataConverter.class) + private String ticket; + + @XStreamAlias("Latitude") + private Double latitude; + + @XStreamAlias("Longitude") + private Double longitude; + + @XStreamAlias("Precision") + private Double precision; + + @XStreamAlias("Recognition") + @XStreamConverter(value = XStreamCDataConverter.class) + private String recognition; + + /////////////////////////////////////// + // 群发消息返回的结果 + /////////////////////////////////////// + /** + * 群发的结果. + */ + @XStreamAlias("Status") + @XStreamConverter(value = XStreamCDataConverter.class) + private String status; + /** + * group_id下粉丝数;或者openid_list中的粉丝数. + */ + @XStreamAlias("TotalCount") + private Integer totalCount; + /** + * 过滤. + * (过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,filterCount = sentCount + errorCount + */ + @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 WxCpXmlMessage fromXml(String xml) { + //修改微信变态的消息内容格式,方便解析 + xml = xml.replace("
+ * 当接受用户消息时,可能会获得以下值:
+ * {@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}
+ *
+ */
+ public String getMsgType() {
+ return this.msgType;
+ }
+
+ /**
+ *
+ * 当发送消息的时候使用:
+ * {@link WxConsts.XmlMsgType#TEXT}
+ * {@link WxConsts.XmlMsgType#IMAGE}
+ * {@link WxConsts.XmlMsgType#VOICE}
+ * {@link WxConsts.XmlMsgType#VIDEO}
+ * {@link WxConsts.XmlMsgType#NEWS}
+ *
+ */
+ public void setMsgType(String msgType) {
+ this.msgType = msgType;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringUtils.toSimpleString(this);
+ }
+
+ @Data
+ @XStreamAlias("ScanCodeInfo")
+ public static class ScanCodeInfo {
+
+ /**
+ * 扫描类型,一般是qrcode.
+ */
+ @XStreamAlias("ScanType")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ private String scanType;
+
+ /**
+ * 扫描结果,即二维码对应的字符串信息.
+ */
+ @XStreamAlias("ScanResult")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ private String scanResult;
+ }
+
+ @Data
+ @XStreamAlias("SendPicsInfo")
+ public static class SendPicsInfo {
+ @XStreamAlias("PicList")
+ protected final List- * Created by BinaryWang on 2017/3/27. - *- * - * @author Binary Wang - */ -@Data -@Builder(builderMethodName = "newBuilder") -public class MpnewsArticle implements Serializable { - private static final long serialVersionUID = 6985871812170756481L; - - private String title; - private String thumbMediaId; - private String author; - private String contentSourceUrl; - private String content; - private String digest; - private String showCoverPic; - -} +package me.chanjar.weixin.cp.bean.article; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * Created by BinaryWang on 2017/3/27. + *+ * + * @author Binary Wang + */ +@Data +@Builder(builderMethodName = "newBuilder") +public class MpnewsArticle implements Serializable { + private static final long serialVersionUID = 6985871812170756481L; + + private String title; + private String thumbMediaId; + private String author; + private String contentSourceUrl; + private String content; + private String digest; + private String showCoverPic; + +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java index 7f10d363b4..5accf3b42d 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java @@ -1,23 +1,23 @@ -package me.chanjar.weixin.cp.bean.article; - -import lombok.Data; - -import java.io.Serializable; - -/** - *
- * Created by BinaryWang on 2017/3/27. - *- * - * @author Binary Wang - */ -@Data -public class NewArticle implements Serializable { - private static final long serialVersionUID = 4087852055781140659L; - - private String title; - private String description; - private String url; - private String picUrl; - -} +package me.chanjar.weixin.cp.bean.article; + +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * Created by BinaryWang on 2017/3/27. + *+ * + * @author Binary Wang + */ +@Data +public class NewArticle implements Serializable { + private static final long serialVersionUID = 4087852055781140659L; + + private String title; + private String description; + private String url; + private String picUrl; + +} diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java index 6d4e8ce893..1e307f0146 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java @@ -1,68 +1,68 @@ -package me.chanjar.weixin.cp.api; - -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.util.http.RequestExecutor; -import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -@Test -public class WxCpBusyRetryTest { - - @DataProvider(name = "getService") - public Object[][] getService() { - WxCpService service = new WxCpServiceImpl() { - - @Override - public synchronized
- * lineColor 包装类 - * 用于描述二维码(小程序码)颜色(RGB参数值), - * 详情请查看文档 https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html - *- * @author Element - */ -@Data -@AllArgsConstructor -public class WxMaCodeLineColor { - private String r = "0", g = "0", b = "0"; -} +package cn.binarywang.wx.miniapp.bean; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + *
+ * lineColor 包装类 + * 用于描述二维码(小程序码)颜色(RGB参数值), + * 详情请查看文档 https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html + *+ * @author Element + */ +@Data +@AllArgsConstructor +public class WxMaCodeLineColor { + private String r = "0", g = "0", b = "0"; +} 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 7d3e2d8de6..50f6f4bba4 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,36 +1,36 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * {"session_key":"nzoqhc3OnwHzeTxJs+inbQ==","expires_in":2592000,"openid":"oVBkZ0aYgDMDIywRdgPW8-joxXc4"} - * - * @author Binary Wang - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class WxMaJscode2SessionResult implements Serializable { - private static final long serialVersionUID = -1060216618475607933L; - - @SerializedName("session_key") - private String sessionKey; - - @SerializedName("expires_in") - private Integer expiresin; - - @SerializedName("openid") - private String openid; - - @SerializedName("unionid") - private String unionid; - - public static WxMaJscode2SessionResult fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaJscode2SessionResult.class); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * {"session_key":"nzoqhc3OnwHzeTxJs+inbQ==","expires_in":2592000,"openid":"oVBkZ0aYgDMDIywRdgPW8-joxXc4"} + * + * @author Binary Wang + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxMaJscode2SessionResult implements Serializable { + private static final long serialVersionUID = -1060216618475607933L; + + @SerializedName("session_key") + private String sessionKey; + + @SerializedName("expires_in") + private Integer expiresin; + + @SerializedName("openid") + private String openid; + + @SerializedName("unionid") + private String unionid; + + public static WxMaJscode2SessionResult fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaJscode2SessionResult.class); + } + +} 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 ec1728db60..3c7e5f1f6d 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 @@ -1,45 +1,45 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.builder.ImageBuilder; -import cn.binarywang.wx.miniapp.builder.TextBuilder; -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.Data; - -import java.io.Serializable; - -/** - * 客服消息 - * - * @author Binary Wang - */ -@Data -public class WxMaKefuMessage implements Serializable { - private static final long serialVersionUID = -9196732086954365246L; - - private String toUser; - private String msgType; - private String content; - private String mediaId; - private String thumbMediaId; - private String title; - private String description; - - /** - * 获得文本消息builder - */ - public static TextBuilder newTextBuilder() { - return new TextBuilder(); - } - - /** - * 获得图片消息builder - */ - public static ImageBuilder newImageBuilder() { - return new ImageBuilder(); - } - - public String toJson() { - return WxMaGsonBuilder.create().toJson(this); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.builder.ImageBuilder; +import cn.binarywang.wx.miniapp.builder.TextBuilder; +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.Data; + +import java.io.Serializable; + +/** + * 客服消息 + * + * @author Binary Wang + */ +@Data +public class WxMaKefuMessage implements Serializable { + private static final long serialVersionUID = -9196732086954365246L; + + private String toUser; + private String msgType; + private String content; + private String mediaId; + private String thumbMediaId; + private String title; + private String description; + + /** + * 获得文本消息builder + */ + public static TextBuilder newTextBuilder() { + return new TextBuilder(); + } + + /** + * 获得图片消息builder + */ + public static ImageBuilder newImageBuilder() { + return new ImageBuilder(); + } + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + +} 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 cb1fed6923..2bd47d2e57 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 @@ -1,151 +1,151 @@ -package cn.binarywang.wx.miniapp.bean; - -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.util.xml.XStreamTransformer; -import com.google.gson.annotations.SerializedName; -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamConverter; -import lombok.Data; -import me.chanjar.weixin.common.util.ToStringUtils; -import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; -import org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.nio.charset.StandardCharsets; - -/** - * @author Binary Wang - */ -@XStreamAlias("xml") -@Data -public class WxMaMessage implements Serializable { - private static final long serialVersionUID = -3586245291677274914L; - - @SerializedName("Encrypt") - @XStreamAlias("Encrypt") - @XStreamConverter(value = XStreamCDataConverter.class) - private String encrypt; - - @SerializedName("ToUserName") - @XStreamAlias("ToUserName") - @XStreamConverter(value = XStreamCDataConverter.class) - private String toUser; - - @SerializedName("FromUserName") - @XStreamAlias("FromUserName") - @XStreamConverter(value = XStreamCDataConverter.class) - private String fromUser; - - @SerializedName("CreateTime") - @XStreamAlias("CreateTime") - @XStreamConverter(value = XStreamCDataConverter.class) - private Integer createTime; - - @SerializedName("MsgDataFormat") - @XStreamAlias("MsgDataFormat") - @XStreamConverter(value = XStreamCDataConverter.class) - private String msgType; - - // 文本消息 - @SerializedName("Content") - @XStreamAlias("Content") - @XStreamConverter(value = XStreamCDataConverter.class) - private String content; - - @SerializedName("MsgId") - @XStreamAlias("MsgId") - @XStreamConverter(value = XStreamCDataConverter.class) - private Long msgId; - - // 图片消息 - @SerializedName("PicUrl") - @XStreamAlias("PicUrl") - @XStreamConverter(value = XStreamCDataConverter.class) - private String picUrl; - - @SerializedName("MediaId") - @XStreamAlias("MediaId") - @XStreamConverter(value = XStreamCDataConverter.class) - private String mediaId; - - // 事件消息 - @SerializedName("Event") - @XStreamAlias("Event") - @XStreamConverter(value = XStreamCDataConverter.class) - private String event; - - @SerializedName("SessionFrom") - @XStreamAlias("SessionFrom") - @XStreamConverter(value = XStreamCDataConverter.class) - private String sessionFrom; - - public static WxMaMessage fromXml(String xml) { - return XStreamTransformer.fromXml(WxMaMessage.class, xml); - } - - public static WxMaMessage fromXml(InputStream is) { - return XStreamTransformer.fromXml(WxMaMessage.class, is); - } - - /** - * 从加密字符串转换 - * - * @param encryptedXml 密文 - * @param wxMaConfig 配置存储器对象 - * @param timestamp 时间戳 - * @param nonce 随机串 - * @param msgSignature 签名串 - */ - public static WxMaMessage fromEncryptedXml(String encryptedXml, - WxMaConfig wxMaConfig, String timestamp, String nonce, - String msgSignature) { - String plainText = new WxMaCryptUtils(wxMaConfig).decrypt(msgSignature, timestamp, nonce, encryptedXml); - return fromXml(plainText); - } - - public static WxMaMessage fromEncryptedXml(InputStream is, WxMaConfig wxMaConfig, String timestamp, - String nonce, String msgSignature) { - try { - return fromEncryptedXml(IOUtils.toString(is, StandardCharsets.UTF_8), wxMaConfig, - timestamp, nonce, msgSignature); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static WxMaMessage fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaMessage.class); - } - - public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config) { - try { - WxMaMessage encryptedMessage = fromJson(encryptedJson); - String plainText = new WxMaCryptUtils(config).decrypt(encryptedMessage.getEncrypt()); - return fromJson(plainText); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig config) { - try { - return fromEncryptedJson(IOUtils.toString(inputStream, StandardCharsets.UTF_8), config); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public String toString() { - return ToStringUtils.toSimpleString(this); - } - - public String toJson() { - return WxMaGsonBuilder.create().toJson(this); - } - -} +package cn.binarywang.wx.miniapp.bean; + +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.util.xml.XStreamTransformer; +import com.google.gson.annotations.SerializedName; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamConverter; +import lombok.Data; +import me.chanjar.weixin.common.util.ToStringUtils; +import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; + +/** + * @author Binary Wang + */ +@XStreamAlias("xml") +@Data +public class WxMaMessage implements Serializable { + private static final long serialVersionUID = -3586245291677274914L; + + @SerializedName("Encrypt") + @XStreamAlias("Encrypt") + @XStreamConverter(value = XStreamCDataConverter.class) + private String encrypt; + + @SerializedName("ToUserName") + @XStreamAlias("ToUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + private String toUser; + + @SerializedName("FromUserName") + @XStreamAlias("FromUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + private String fromUser; + + @SerializedName("CreateTime") + @XStreamAlias("CreateTime") + @XStreamConverter(value = XStreamCDataConverter.class) + private Integer createTime; + + @SerializedName("MsgDataFormat") + @XStreamAlias("MsgDataFormat") + @XStreamConverter(value = XStreamCDataConverter.class) + private String msgType; + + // 文本消息 + @SerializedName("Content") + @XStreamAlias("Content") + @XStreamConverter(value = XStreamCDataConverter.class) + private String content; + + @SerializedName("MsgId") + @XStreamAlias("MsgId") + @XStreamConverter(value = XStreamCDataConverter.class) + private Long msgId; + + // 图片消息 + @SerializedName("PicUrl") + @XStreamAlias("PicUrl") + @XStreamConverter(value = XStreamCDataConverter.class) + private String picUrl; + + @SerializedName("MediaId") + @XStreamAlias("MediaId") + @XStreamConverter(value = XStreamCDataConverter.class) + private String mediaId; + + // 事件消息 + @SerializedName("Event") + @XStreamAlias("Event") + @XStreamConverter(value = XStreamCDataConverter.class) + private String event; + + @SerializedName("SessionFrom") + @XStreamAlias("SessionFrom") + @XStreamConverter(value = XStreamCDataConverter.class) + private String sessionFrom; + + public static WxMaMessage fromXml(String xml) { + return XStreamTransformer.fromXml(WxMaMessage.class, xml); + } + + public static WxMaMessage fromXml(InputStream is) { + return XStreamTransformer.fromXml(WxMaMessage.class, is); + } + + /** + * 从加密字符串转换 + * + * @param encryptedXml 密文 + * @param wxMaConfig 配置存储器对象 + * @param timestamp 时间戳 + * @param nonce 随机串 + * @param msgSignature 签名串 + */ + public static WxMaMessage fromEncryptedXml(String encryptedXml, + WxMaConfig wxMaConfig, String timestamp, String nonce, + String msgSignature) { + String plainText = new WxMaCryptUtils(wxMaConfig).decrypt(msgSignature, timestamp, nonce, encryptedXml); + return fromXml(plainText); + } + + public static WxMaMessage fromEncryptedXml(InputStream is, WxMaConfig wxMaConfig, String timestamp, + String nonce, String msgSignature) { + try { + return fromEncryptedXml(IOUtils.toString(is, StandardCharsets.UTF_8), wxMaConfig, + timestamp, nonce, msgSignature); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static WxMaMessage fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaMessage.class); + } + + public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config) { + try { + WxMaMessage encryptedMessage = fromJson(encryptedJson); + String plainText = new WxMaCryptUtils(config).decrypt(encryptedMessage.getEncrypt()); + return fromJson(plainText); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig config) { + try { + return fromEncryptedJson(IOUtils.toString(inputStream, StandardCharsets.UTF_8), config); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public String toString() { + return ToStringUtils.toSimpleString(this); + } + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + +} 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..87aa3f8bdf 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,32 +1,32 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * @author Binary Wang - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class WxMaQrcode extends AbstractWxMaQrcodeWrapper implements Serializable { - private static final long serialVersionUID = 5777119669111011584L; - private String path; - private int width = 430; - - public WxMaQrcode(String path, int width) { - this.path = path; - this.width = width; - } - - public static WxMaQrcode fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaQrcode.class); - } - - @Override - public String toString() { - return WxMaGsonBuilder.create().toJson(this); - } -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * @author Binary Wang + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxMaQrcode extends AbstractWxMaQrcodeWrapper implements Serializable { + private static final long serialVersionUID = 5777119669111011584L; + private String path; + private int width = 430; + + public WxMaQrcode(String path, int width) { + this.path = path; + this.width = width; + } + + public static WxMaQrcode fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaQrcode.class); + } + + @Override + public String toString() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java index 32268b4c4b..3e9760395e 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java @@ -1,108 +1,108 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.Builder; -import lombok.Data; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * 参考 https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#接口说明 模板消息部分 - * - * @author Binary Wang - */ -@Data -@Builder -public class WxMaTemplateMessage implements Serializable { - private static final long serialVersionUID = 5063374783759519418L; - - /** - *
- * 参数:touser - * 是否必填: 是 - * 描述: 接收者(用户)的 openid - *- */ - private String toUser; - - /** - *
- * 参数:template_id - * 是否必填: 是 - * 描述: 所需下发的模板消息的id - *- */ - private String templateId; - - /** - *
- * 参数:page - * 是否必填: 否 - * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 - *- */ - private String page; - - /** - *
- * 参数:form_id - * 是否必填: 是 - * 描述: 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id - *- */ - private String formId; - - /** - *
- * 参数:data - * 是否必填: 是 - * 描述: 模板内容,不填则下发空模板 - *- */ - @Builder.Default - private final List data = new ArrayList<>(); - - /** - *
- * 参数:color - * 是否必填: 否 - * 描述: 模板内容字体的颜色,不填默认黑色 - *- */ - private String color; - - /** - *
- * 参数:emphasis_keyword - * 是否必填: 否 - * 描述: 模板需要放大的关键词,不填则默认无放大 - *- */ - private String emphasisKeyword; - - public String toJson() { - return WxMaGsonBuilder.create().toJson(this); - } - - @lombok.Data - public static class Data { - private String name; - private String value; - private String color; - - public Data(String name, String value) { - this.name = name; - this.value = value; - } - - public Data(String name, String value, String color) { - this.name = name; - this.value = value; - this.color = color; - } - - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 参考 https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#接口说明 模板消息部分 + * + * @author Binary Wang + */ +@Data +@Builder +public class WxMaTemplateMessage implements Serializable { + private static final long serialVersionUID = 5063374783759519418L; + + /** + *
+ * 参数:touser + * 是否必填: 是 + * 描述: 接收者(用户)的 openid + *+ */ + private String toUser; + + /** + *
+ * 参数:template_id + * 是否必填: 是 + * 描述: 所需下发的模板消息的id + *+ */ + private String templateId; + + /** + *
+ * 参数:page + * 是否必填: 否 + * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 + *+ */ + private String page; + + /** + *
+ * 参数:form_id + * 是否必填: 是 + * 描述: 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id + *+ */ + private String formId; + + /** + *
+ * 参数:data + * 是否必填: 是 + * 描述: 模板内容,不填则下发空模板 + *+ */ + @Builder.Default + private final List data = new ArrayList<>(); + + /** + *
+ * 参数:color + * 是否必填: 否 + * 描述: 模板内容字体的颜色,不填默认黑色 + *+ */ + private String color; + + /** + *
+ * 参数:emphasis_keyword + * 是否必填: 否 + * 描述: 模板需要放大的关键词,不填则默认无放大 + *+ */ + private String emphasisKeyword; + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + + @lombok.Data + public static class Data { + private String name; + private String value; + private String color; + + public Data(String name, String value) { + this.name = name; + this.value = value; + } + + public Data(String name, String value, String color) { + this.name = name; + this.value = value; + this.color = color; + } + + } + +} 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 8b0ed8fe6a..a16fc30a1a 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,35 +1,35 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author Binary Wang - */ -@Data -public class WxMaUserInfo implements Serializable { - private static final long serialVersionUID = 6719822331555402137L; - - private String openId; - private String nickName; - private String gender; - private String language; - private String city; - private String province; - private String country; - private String avatarUrl; - private String unionId; - private Watermark watermark; - - public static WxMaUserInfo fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaUserInfo.class); - } - - @Data - public static class Watermark { - private String timestamp; - private String appid; - } -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Binary Wang + */ +@Data +public class WxMaUserInfo implements Serializable { + private static final long serialVersionUID = 6719822331555402137L; + + private String openId; + private String nickName; + private String gender; + private String language; + private String city; + private String province; + private String country; + private String avatarUrl; + private String unionId; + private Watermark watermark; + + public static WxMaUserInfo fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaUserInfo.class); + } + + @Data + public static class Watermark { + private String timestamp; + private String appid; + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcode.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcode.java index 8e629096c6..7d9c60e676 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcode.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcode.java @@ -1,33 +1,33 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * - * @author Element - * @date 2017/7/27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class WxMaWxcode extends AbstractWxMaQrcodeWrapper implements Serializable { - private static final long serialVersionUID = 1287399621649210322L; - - private String path; - private int width = 430; - - @SerializedName("auto_color") - private boolean autoColor = true; - - @SerializedName("line_color") - private WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0"); - - public static WxMaWxcode fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaWxcode.class); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * + * @author Element + * @date 2017/7/27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxMaWxcode extends AbstractWxMaQrcodeWrapper implements Serializable { + private static final long serialVersionUID = 1287399621649210322L; + + private String path; + private int width = 430; + + @SerializedName("auto_color") + private boolean autoColor = true; + + @SerializedName("line_color") + private WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0"); + + public static WxMaWxcode fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaWxcode.class); + } + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java index 5f76273b54..928e9b7d91 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java @@ -1,34 +1,34 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * - * @author Element - * @date 2017/7/27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class WxMaWxcodeLimit extends AbstractWxMaQrcodeWrapper implements Serializable { - private static final long serialVersionUID = 4782193774524960401L; - private String scene; - private String page; - - private int width = 430; - - @SerializedName("auto_color") - private boolean autoColor = true; - - @SerializedName("line_color") - private WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0"); - - public static WxMaWxcodeLimit fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaWxcodeLimit.class); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * + * @author Element + * @date 2017/7/27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxMaWxcodeLimit extends AbstractWxMaQrcodeWrapper implements Serializable { + private static final long serialVersionUID = 4782193774524960401L; + private String scene; + private String page; + + private int width = 430; + + @SerializedName("auto_color") + private boolean autoColor = true; + + @SerializedName("line_color") + private WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0"); + + public static WxMaWxcodeLimit fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaWxcodeLimit.class); + } + +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java index d6aa31a71f..39475453a0 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java @@ -1,73 +1,73 @@ -package cn.binarywang.wx.miniapp.api.impl; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; -import cn.binarywang.wx.miniapp.test.ApiTestModule; -import cn.binarywang.wx.miniapp.test.TestConfig; -import com.google.common.collect.Lists; -import com.google.inject.Inject; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.exception.WxErrorException; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * 测试客服相关接口 - * - * @author Binary Wang - */ -@Test -@Guice(modules = ApiTestModule.class) -public class WxMaMsgServiceImplTest { - - @Inject - protected WxMaService wxService; - - public void testSendKefuMpNewsMessage() throws WxErrorException { - TestConfig configStorage = (TestConfig) this.wxService - .getWxMaConfig(); - WxMaKefuMessage message = new WxMaKefuMessage(); - message.setMsgType(WxConsts.KefuMsgType.MPNEWS); - message.setToUser(configStorage.getOpenid()); - - this.wxService.getMsgService().sendKefuMsg(message); - } - - public void testSendKefuMessage() throws WxErrorException { - TestConfig config = (TestConfig) this.wxService - .getWxMaConfig(); - WxMaKefuMessage message = new WxMaKefuMessage(); - message.setMsgType(WxConsts.KefuMsgType.TEXT); - message.setToUser(config.getOpenid()); - message.setContent( - "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World"); - - this.wxService.getMsgService().sendKefuMsg(message); - } - - @Test(invocationCount = 5, threadPoolSize = 3) - public void testSendTemplateMsg() throws WxErrorException { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); - - WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder() - .toUser(config.getOpenid()) - .formId("FORMID") - .page("index") - .data(Lists.newArrayList( - new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), - new WxMaTemplateMessage.Data("keyword2", dateFormat.format(new Date()), "#173177"), - new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), - new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) - .templateId(config.getTemplateId()) - .emphasisKeyword("keyword1.DATA") - .build(); - - this.wxService.getMsgService().sendTemplateMsg(templateMessage); - } - -} +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; +import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; +import cn.binarywang.wx.miniapp.test.ApiTestModule; +import cn.binarywang.wx.miniapp.test.TestConfig; +import com.google.common.collect.Lists; +import com.google.inject.Inject; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.exception.WxErrorException; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 测试客服相关接口 + * + * @author Binary Wang + */ +@Test +@Guice(modules = ApiTestModule.class) +public class WxMaMsgServiceImplTest { + + @Inject + protected WxMaService wxService; + + public void testSendKefuMpNewsMessage() throws WxErrorException { + TestConfig configStorage = (TestConfig) this.wxService + .getWxMaConfig(); + WxMaKefuMessage message = new WxMaKefuMessage(); + message.setMsgType(WxConsts.KefuMsgType.MPNEWS); + message.setToUser(configStorage.getOpenid()); + + this.wxService.getMsgService().sendKefuMsg(message); + } + + public void testSendKefuMessage() throws WxErrorException { + TestConfig config = (TestConfig) this.wxService + .getWxMaConfig(); + WxMaKefuMessage message = new WxMaKefuMessage(); + message.setMsgType(WxConsts.KefuMsgType.TEXT); + message.setToUser(config.getOpenid()); + message.setContent( + "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World"); + + this.wxService.getMsgService().sendKefuMsg(message); + } + + @Test(invocationCount = 5, threadPoolSize = 3) + public void testSendTemplateMsg() throws WxErrorException { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); + + WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder() + .toUser(config.getOpenid()) + .formId("FORMID") + .page("index") + .data(Lists.newArrayList( + new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), + new WxMaTemplateMessage.Data("keyword2", dateFormat.format(new Date()), "#173177"), + new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), + new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) + .templateId(config.getTemplateId()) + .emphasisKeyword("keyword1.DATA") + .build(); + + this.wxService.getMsgService().sendTemplateMsg(templateMessage); + } + +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java index d4464312eb..e1db78f8de 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java @@ -1,31 +1,31 @@ -package cn.binarywang.wx.miniapp.bean; - -import com.google.common.collect.Lists; -import org.testng.annotations.Test; - -import static org.testng.AssertJUnit.assertEquals; - -/** - * @author Binary Wang - */ -public class WxMaTemplateMessageTest { - @Test - public void testToJson() throws Exception { - WxMaTemplateMessage tm = WxMaTemplateMessage.builder() - .toUser("OPENID") - //.color("aaaaa") - .formId("FORMID") - .page("index") - .data(Lists.newArrayList( - new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), - new WxMaTemplateMessage.Data("keyword2", "2015年01月05日12:30", "#173177"), - new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), - new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) - .templateId("TEMPLATE_ID") - .emphasisKeyword("keyword1.DATA") - .build(); - - assertEquals(tm.toJson(), "{\"touser\":\"OPENID\",\"template_id\":\"TEMPLATE_ID\",\"page\":\"index\",\"form_id\":\"FORMID\",\"emphasis_keyword\":\"keyword1.DATA\",\"data\":{\"keyword1\":{\"value\":\"339208499\",\"color\":\"#173177\"},\"keyword2\":{\"value\":\"2015年01月05日12:30\",\"color\":\"#173177\"},\"keyword3\":{\"value\":\"粤海喜来登酒店\",\"color\":\"#173177\"},\"keyword4\":{\"value\":\"广州市天河区天河路208号\",\"color\":\"#173177\"}}}"); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import com.google.common.collect.Lists; +import org.testng.annotations.Test; + +import static org.testng.AssertJUnit.assertEquals; + +/** + * @author Binary Wang + */ +public class WxMaTemplateMessageTest { + @Test + public void testToJson() throws Exception { + WxMaTemplateMessage tm = WxMaTemplateMessage.builder() + .toUser("OPENID") + //.color("aaaaa") + .formId("FORMID") + .page("index") + .data(Lists.newArrayList( + new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), + new WxMaTemplateMessage.Data("keyword2", "2015年01月05日12:30", "#173177"), + new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), + new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) + .templateId("TEMPLATE_ID") + .emphasisKeyword("keyword1.DATA") + .build(); + + assertEquals(tm.toJson(), "{\"touser\":\"OPENID\",\"template_id\":\"TEMPLATE_ID\",\"page\":\"index\",\"form_id\":\"FORMID\",\"emphasis_keyword\":\"keyword1.DATA\",\"data\":{\"keyword1\":{\"value\":\"339208499\",\"color\":\"#173177\"},\"keyword2\":{\"value\":\"2015年01月05日12:30\",\"color\":\"#173177\"},\"keyword3\":{\"value\":\"粤海喜来登酒店\",\"color\":\"#173177\"},\"keyword4\":{\"value\":\"广州市天河区天河路208号\",\"color\":\"#173177\"}}}"); + } + +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java index 8d14b261ff..bc0f6bb000 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java @@ -1,148 +1,148 @@ -package cn.binarywang.wx.miniapp.demo; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; -import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; -import cn.binarywang.wx.miniapp.bean.WxMaMessage; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; -import cn.binarywang.wx.miniapp.config.WxMaConfig; -import cn.binarywang.wx.miniapp.constant.WxMaConstants; -import cn.binarywang.wx.miniapp.message.WxMaMessageHandler; -import cn.binarywang.wx.miniapp.message.WxMaMessageRouter; -import cn.binarywang.wx.miniapp.test.TestConfig; -import com.google.common.collect.Lists; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.session.WxSessionManager; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletHandler; -import org.eclipse.jetty.servlet.ServletHolder; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.concurrent.locks.ReentrantLock; - -/** - * @author Binary Wang - */ -public class WxMaDemoServer { - - private static final WxMaMessageHandler logHandler = new WxMaMessageHandler() { - @Override - public void handle(WxMaMessage wxMessage, Map
- * 群发消息服务类 - * Created by Binary Wang on 2017-8-16. - *- * - * @author Binary Wang - */ -public interface WxMpMassMessageService { - /** - * 上传群发用的图文消息 - */ - String MEDIA_UPLOAD_NEWS_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadnews"; - /** - * 上传群发用的视频 - */ - String MEDIA_UPLOAD_VIDEO_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo"; - /** - * 分组群发消息 - */ - String MESSAGE_MASS_SENDALL_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall"; - /** - * 按openId列表群发消息 - */ - String MESSAGE_MASS_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/send"; - /** - * 群发消息预览接口 - */ - String MESSAGE_MASS_PREVIEW_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; - /** - * 删除群发接口 - */ - String MESSAGE_MASS_DELETE_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/delete"; - - /** - *
- * 上传群发用的图文消息,上传后才能群发图文消息 - * - * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN - *- * - * @see #massGroupMessageSend(WxMpMassTagMessage) - * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) - */ - WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException; - - /** - *
- * 上传群发用的视频,上传后才能群发视频消息 - * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN - *- * - * @see #massGroupMessageSend(WxMpMassTagMessage) - * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) - */ - WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException; - - /** - *
- * 分组群发消息
- * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMpMassNews)} 获得media_id,然后再发送
- * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMpMassVideo)} 获得media_id,然后再发送
- * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
- *
- */
- WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException;
-
- /**
- *
- * 按openId列表群发消息
- * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMpMassNews)} 获得media_id,然后再发送
- * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMpMassVideo)} 获得media_id,然后再发送
- * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
- *
- */
- WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException;
-
- /**
- * - * 群发消息预览接口 - * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版。为了满足第三方平台开发者的需求,在保留对openID预览能力的同时,增加了对指定微信号发送预览的能力,但该能力每日调用次数有限制(100次),请勿滥用。 - * 接口调用请求说明 - * http请求方式: POST - * https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN - * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN - *- * - * @return wxMpMassSendResult - */ - WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws WxErrorException; - - /** - *
- * 删除群发 - * 群发之后,随时可以通过该接口删除群发。 - * 请注意: - * 1、只有已经发送成功的消息才能删除 - * 2、删除消息是将消息的图文详情页失效,已经收到的用户,还是能在其本地看到消息卡片。 - * 3、删除群发消息只能删除图文消息和视频消息,其他类型的消息一经发送,无法删除。 - * 4、如果多次群发发送的是一个图文消息,那么删除其中一次群发,就会删除掉这个图文消息也,导致所有群发都失效 - * 接口调用请求说明: - * http请求方式: POST - * https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=ACCESS_TOKEN - * 详情请见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21 - *- * - * @param msgId 发送出去的消息ID - * @param articleIndex 要删除的文章在图文消息中的位置,第一篇编号为1,该字段不填或填0会删除全部文章 - */ - void delete(Integer msgId, Integer articleIndex) throws WxErrorException; - -} +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.*; +import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; + +/** + *
+ * 群发消息服务类 + * Created by Binary Wang on 2017-8-16. + *+ * + * @author Binary Wang + */ +public interface WxMpMassMessageService { + /** + * 上传群发用的图文消息 + */ + String MEDIA_UPLOAD_NEWS_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadnews"; + /** + * 上传群发用的视频 + */ + String MEDIA_UPLOAD_VIDEO_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo"; + /** + * 分组群发消息 + */ + String MESSAGE_MASS_SENDALL_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall"; + /** + * 按openId列表群发消息 + */ + String MESSAGE_MASS_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/send"; + /** + * 群发消息预览接口 + */ + String MESSAGE_MASS_PREVIEW_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; + /** + * 删除群发接口 + */ + String MESSAGE_MASS_DELETE_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/delete"; + + /** + *
+ * 上传群发用的图文消息,上传后才能群发图文消息 + * + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN + *+ * + * @see #massGroupMessageSend(WxMpMassTagMessage) + * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) + */ + WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException; + + /** + *
+ * 上传群发用的视频,上传后才能群发视频消息 + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN + *+ * + * @see #massGroupMessageSend(WxMpMassTagMessage) + * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) + */ + WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException; + + /** + *
+ * 分组群发消息
+ * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMpMassNews)} 获得media_id,然后再发送
+ * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMpMassVideo)} 获得media_id,然后再发送
+ * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
+ *
+ */
+ WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException;
+
+ /**
+ *
+ * 按openId列表群发消息
+ * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMpMassNews)} 获得media_id,然后再发送
+ * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMpMassVideo)} 获得media_id,然后再发送
+ * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
+ *
+ */
+ WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException;
+
+ /**
+ * + * 群发消息预览接口 + * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版。为了满足第三方平台开发者的需求,在保留对openID预览能力的同时,增加了对指定微信号发送预览的能力,但该能力每日调用次数有限制(100次),请勿滥用。 + * 接口调用请求说明 + * http请求方式: POST + * https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN + * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN + *+ * + * @return wxMpMassSendResult + */ + WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws WxErrorException; + + /** + *
+ * 删除群发 + * 群发之后,随时可以通过该接口删除群发。 + * 请注意: + * 1、只有已经发送成功的消息才能删除 + * 2、删除消息是将消息的图文详情页失效,已经收到的用户,还是能在其本地看到消息卡片。 + * 3、删除群发消息只能删除图文消息和视频消息,其他类型的消息一经发送,无法删除。 + * 4、如果多次群发发送的是一个图文消息,那么删除其中一次群发,就会删除掉这个图文消息也,导致所有群发都失效 + * 接口调用请求说明: + * http请求方式: POST + * https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=ACCESS_TOKEN + * 详情请见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21 + *+ * + * @param msgId 发送出去的消息ID + * @param articleIndex 要删除的文章在图文消息中的位置,第一篇编号为1,该字段不填或填0会删除全部文章 + */ + void delete(Integer msgId, Integer articleIndex) throws WxErrorException; + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpShakeService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpShakeService.java index 697bfe899d..3d423b0feb 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpShakeService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpShakeService.java @@ -1,61 +1,61 @@ -package me.chanjar.weixin.mp.api; - -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.WxMpShakeInfoResult; -import me.chanjar.weixin.mp.bean.WxMpShakeQuery; -import me.chanjar.weixin.mp.bean.shake.*; - -/** - * 摇一摇周边的相关接口 - * - * @author rememberber - */ -public interface WxMpShakeService { - - /** - *
- * 获取设备及用户信息- * - * @param wxMpShakeQuery 查询参数 - */ - WxMpShakeInfoResult getShakeInfo(WxMpShakeQuery wxMpShakeQuery) throws WxErrorException; - - /** - *
- * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。 - * 详情请见: https://mp.weixin.qq.com/wiki?action=doc&id=mp1443447963 - * http请求方式: POST(请使用https协议) - * 接口地址:https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=ACCESS_TOKE - *
- * 页面管理- * @param shakeAroundPageAddQuery - * @return - * @throws WxErrorException - */ - WxMpShakeAroundPageAddResult pageAdd(WxMpShakeAroundPageAddQuery shakeAroundPageAddQuery) throws WxErrorException; - - /** - *
- * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1459246752 - *
- * 配置设备与页面的关联关系- * @param shakeAroundDeviceBindPageQuery - * @return - * @throws WxErrorException - */ - WxError deviceBindPageQuery(WxMpShakeAroundDeviceBindPageQuery shakeAroundDeviceBindPageQuery) throws WxErrorException; - - /** - *
- * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1459301931 - *
- * 查询设备与页面的关联关系- * @param shakeAroundRelationSearchQuery - * @return - * @throws WxErrorException - */ - WxMpShakeAroundRelationSearchResult relationSearch(WxMpShakeAroundRelationSearchQuery shakeAroundRelationSearchQuery) throws WxErrorException; -} +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.WxMpShakeInfoResult; +import me.chanjar.weixin.mp.bean.WxMpShakeQuery; +import me.chanjar.weixin.mp.bean.shake.*; + +/** + * 摇一摇周边的相关接口 + * + * @author rememberber + */ +public interface WxMpShakeService { + + /** + *
- * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443447914 - *
+ * 获取设备及用户信息+ * + * @param wxMpShakeQuery 查询参数 + */ + WxMpShakeInfoResult getShakeInfo(WxMpShakeQuery wxMpShakeQuery) throws WxErrorException; + + /** + *
+ * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。 + * 详情请见: https://mp.weixin.qq.com/wiki?action=doc&id=mp1443447963 + * http请求方式: POST(请使用https协议) + * 接口地址:https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=ACCESS_TOKE + *
+ * 页面管理+ * @param shakeAroundPageAddQuery + * @return + * @throws WxErrorException + */ + WxMpShakeAroundPageAddResult pageAdd(WxMpShakeAroundPageAddQuery shakeAroundPageAddQuery) throws WxErrorException; + + /** + *
+ * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1459246752 + *
+ * 配置设备与页面的关联关系+ * @param shakeAroundDeviceBindPageQuery + * @return + * @throws WxErrorException + */ + WxError deviceBindPageQuery(WxMpShakeAroundDeviceBindPageQuery shakeAroundDeviceBindPageQuery) throws WxErrorException; + + /** + *
+ * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1459301931 + *
+ * 查询设备与页面的关联关系+ * @param shakeAroundRelationSearchQuery + * @return + * @throws WxErrorException + */ + WxMpShakeAroundRelationSearchResult relationSearch(WxMpShakeAroundRelationSearchQuery shakeAroundRelationSearchQuery) throws WxErrorException; +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java index 49ed7589f3..4fe596442c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java @@ -1,239 +1,239 @@ -package me.chanjar.weixin.mp.api.impl; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonPrimitive; -import com.google.gson.reflect.TypeToken; -import me.chanjar.weixin.common.bean.WxCardApiSignature; -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.util.RandomUtils; -import me.chanjar.weixin.common.util.crypto.SHA1; -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; -import me.chanjar.weixin.mp.api.WxMpCardService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.result.WxMpCardResult; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.concurrent.locks.Lock; - -/** - * Created by Binary Wang on 2016/7/27. - */ -public class WxMpCardServiceImpl implements WxMpCardService { - - private final Logger log = LoggerFactory.getLogger(WxMpCardServiceImpl.class); - - private WxMpService wxMpService; - - public WxMpCardServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public WxMpService getWxMpService() { - return this.wxMpService; - } - - /** - * 获得卡券api_ticket,不强制刷新卡券api_ticket - * - * @return 卡券api_ticket - * @see #getCardApiTicket(boolean) - */ - @Override - public String getCardApiTicket() throws WxErrorException { - return getCardApiTicket(false); - } - - /** - *
+ * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443447914 + *
- * 获得卡券api_ticket - * 获得时会检查卡券apiToken是否过期,如果过期了,那么就刷新一下,否则就什么都不干 - * - * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD - * .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94 - * .9F.E6.88.90.E7.AE.97.E6.B3.95 - *- * - * @param forceRefresh 强制刷新 - * @return 卡券api_ticket - */ - @Override - public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { - Lock lock = getWxMpService().getWxMpConfigStorage().getCardApiTicketLock(); - try { - lock.lock(); - - if (forceRefresh) { - this.getWxMpService().getWxMpConfigStorage().expireCardApiTicket(); - } - - if (this.getWxMpService().getWxMpConfigStorage().isCardApiTicketExpired()) { - String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor.create(this.getWxMpService().getRequestHttp()), CARD_GET_TICKET, null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); - String cardApiTicket = tmpJsonObject.get("ticket").getAsString(); - int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); - this.getWxMpService().getWxMpConfigStorage().updateCardApiTicket(cardApiTicket, expiresInSeconds); - } - } finally { - lock.unlock(); - } - return this.getWxMpService().getWxMpConfigStorage().getCardApiTicket(); - } - - /** - *
- * 创建调用卡券api时所需要的签名 - * - * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD - * .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94 - * .9F.E6.88.90.E7.AE.97.E6.B3.95 - *- * - * @param optionalSignParam 参与签名的参数数组。 - * 可以为下列字段:app_id, card_id, card_type, code, openid, location_id - * 注意:当做wx.chooseCard调用时,必须传入app_id参与签名,否则会造成签名失败导致拉取卡券列表为空 - * @return 卡券Api签名对象 - */ - @Override - public WxCardApiSignature createCardApiSignature(String... optionalSignParam) throws - WxErrorException { - long timestamp = System.currentTimeMillis() / 1000; - String nonceStr = RandomUtils.getRandomStr(); - String cardApiTicket = getCardApiTicket(false); - - String[] signParam = Arrays.copyOf(optionalSignParam, optionalSignParam.length + 3); - signParam[optionalSignParam.length] = String.valueOf(timestamp); - signParam[optionalSignParam.length + 1] = nonceStr; - signParam[optionalSignParam.length + 2] = cardApiTicket; - String signature = SHA1.gen(signParam); - WxCardApiSignature cardApiSignature = new WxCardApiSignature(); - cardApiSignature.setTimestamp(timestamp); - cardApiSignature.setNonceStr(nonceStr); - cardApiSignature.setSignature(signature); - return cardApiSignature; - } - - /** - * 卡券Code解码 - * - * @param encryptCode 加密Code,通过JSSDK的chooseCard接口获得 - * @return 解密后的Code - */ - @Override - public String decryptCardCode(String encryptCode) throws WxErrorException { - JsonObject param = new JsonObject(); - param.addProperty("encrypt_code", encryptCode); - String responseContent = this.wxMpService.post(CARD_CODE_DECRYPT, param.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); - JsonPrimitive jsonPrimitive = tmpJsonObject.getAsJsonPrimitive("code"); - return jsonPrimitive.getAsString(); - } - - /** - * 卡券Code查询 - * - * @param cardId 卡券ID代表一类卡券 - * @param code 单张卡券的唯一标准 - * @param checkConsume 是否校验code核销状态,填入true和false时的code异常状态返回数据不同 - * @return WxMpCardResult对象 - */ - @Override - public WxMpCardResult queryCardCode(String cardId, String code, boolean checkConsume) throws WxErrorException { - JsonObject param = new JsonObject(); - param.addProperty("card_id", cardId); - param.addProperty("code", code); - param.addProperty("check_consume", checkConsume); - String responseContent = this.wxMpService.post(CARD_CODE_GET, param.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement, - new TypeToken
+ * 获得卡券api_ticket + * 获得时会检查卡券apiToken是否过期,如果过期了,那么就刷新一下,否则就什么都不干 + * + * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD + * .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94 + * .9F.E6.88.90.E7.AE.97.E6.B3.95 + *+ * + * @param forceRefresh 强制刷新 + * @return 卡券api_ticket + */ + @Override + public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { + Lock lock = getWxMpService().getWxMpConfigStorage().getCardApiTicketLock(); + try { + lock.lock(); + + if (forceRefresh) { + this.getWxMpService().getWxMpConfigStorage().expireCardApiTicket(); + } + + if (this.getWxMpService().getWxMpConfigStorage().isCardApiTicketExpired()) { + String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor.create(this.getWxMpService().getRequestHttp()), CARD_GET_TICKET, null); + JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); + String cardApiTicket = tmpJsonObject.get("ticket").getAsString(); + int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); + this.getWxMpService().getWxMpConfigStorage().updateCardApiTicket(cardApiTicket, expiresInSeconds); + } + } finally { + lock.unlock(); + } + return this.getWxMpService().getWxMpConfigStorage().getCardApiTicket(); + } + + /** + *
+ * 创建调用卡券api时所需要的签名 + * + * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD + * .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94 + * .9F.E6.88.90.E7.AE.97.E6.B3.95 + *+ * + * @param optionalSignParam 参与签名的参数数组。 + * 可以为下列字段:app_id, card_id, card_type, code, openid, location_id + * 注意:当做wx.chooseCard调用时,必须传入app_id参与签名,否则会造成签名失败导致拉取卡券列表为空 + * @return 卡券Api签名对象 + */ + @Override + public WxCardApiSignature createCardApiSignature(String... optionalSignParam) throws + WxErrorException { + long timestamp = System.currentTimeMillis() / 1000; + String nonceStr = RandomUtils.getRandomStr(); + String cardApiTicket = getCardApiTicket(false); + + String[] signParam = Arrays.copyOf(optionalSignParam, optionalSignParam.length + 3); + signParam[optionalSignParam.length] = String.valueOf(timestamp); + signParam[optionalSignParam.length + 1] = nonceStr; + signParam[optionalSignParam.length + 2] = cardApiTicket; + String signature = SHA1.gen(signParam); + WxCardApiSignature cardApiSignature = new WxCardApiSignature(); + cardApiSignature.setTimestamp(timestamp); + cardApiSignature.setNonceStr(nonceStr); + cardApiSignature.setSignature(signature); + return cardApiSignature; + } + + /** + * 卡券Code解码 + * + * @param encryptCode 加密Code,通过JSSDK的chooseCard接口获得 + * @return 解密后的Code + */ + @Override + public String decryptCardCode(String encryptCode) throws WxErrorException { + JsonObject param = new JsonObject(); + param.addProperty("encrypt_code", encryptCode); + String responseContent = this.wxMpService.post(CARD_CODE_DECRYPT, param.toString()); + JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); + JsonPrimitive jsonPrimitive = tmpJsonObject.getAsJsonPrimitive("code"); + return jsonPrimitive.getAsString(); + } + + /** + * 卡券Code查询 + * + * @param cardId 卡券ID代表一类卡券 + * @param code 单张卡券的唯一标准 + * @param checkConsume 是否校验code核销状态,填入true和false时的code异常状态返回数据不同 + * @return WxMpCardResult对象 + */ + @Override + public WxMpCardResult queryCardCode(String cardId, String code, boolean checkConsume) throws WxErrorException { + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + param.addProperty("code", code); + param.addProperty("check_consume", checkConsume); + String responseContent = this.wxMpService.post(CARD_CODE_GET, param.toString()); + JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement, + new TypeToken
- * 群发消息服务类 - * Created by Binary Wang on 2017-8-16. - *- * - * @author Binary Wang - */ -public class WxMpMassMessageServiceImpl implements WxMpMassMessageService { - protected final Logger log = LoggerFactory.getLogger(this.getClass()); - private WxMpService wxMpService; - - public WxMpMassMessageServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException { - String responseContent = this.wxMpService.post(MEDIA_UPLOAD_NEWS_URL, news.toJson()); - return WxMpMassUploadResult.fromJson(responseContent); - } - - @Override - public WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException { - String responseContent = this.wxMpService.post(MEDIA_UPLOAD_VIDEO_URL, video.toJson()); - return WxMpMassUploadResult.fromJson(responseContent); - } - - @Override - public WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException { - String responseContent = this.wxMpService.post(WxMpMassMessageService.MESSAGE_MASS_SENDALL_URL, message.toJson()); - return WxMpMassSendResult.fromJson(responseContent); - } - - @Override - public WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException { - String responseContent = this.wxMpService.post(MESSAGE_MASS_SEND_URL, message.toJson()); - return WxMpMassSendResult.fromJson(responseContent); - } - - @Override - public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws WxErrorException { - String responseContent = this.wxMpService.post(MESSAGE_MASS_PREVIEW_URL, wxMpMassPreviewMessage.toJson()); - return WxMpMassSendResult.fromJson(responseContent); - } - - @Override - public void delete(Integer msgId, Integer articleIndex) throws WxErrorException { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("msg_id", msgId); - jsonObject.addProperty("article_idx", articleIndex); - this.wxMpService.post(MESSAGE_MASS_DELETE_URL, jsonObject.toString()); - } - -} +package me.chanjar.weixin.mp.api.impl; + +import com.google.gson.JsonObject; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpMassMessageService; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.*; +import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + *
+ * 群发消息服务类 + * Created by Binary Wang on 2017-8-16. + *+ * + * @author Binary Wang + */ +public class WxMpMassMessageServiceImpl implements WxMpMassMessageService { + protected final Logger log = LoggerFactory.getLogger(this.getClass()); + private WxMpService wxMpService; + + public WxMpMassMessageServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + @Override + public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException { + String responseContent = this.wxMpService.post(MEDIA_UPLOAD_NEWS_URL, news.toJson()); + return WxMpMassUploadResult.fromJson(responseContent); + } + + @Override + public WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException { + String responseContent = this.wxMpService.post(MEDIA_UPLOAD_VIDEO_URL, video.toJson()); + return WxMpMassUploadResult.fromJson(responseContent); + } + + @Override + public WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException { + String responseContent = this.wxMpService.post(WxMpMassMessageService.MESSAGE_MASS_SENDALL_URL, message.toJson()); + return WxMpMassSendResult.fromJson(responseContent); + } + + @Override + public WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException { + String responseContent = this.wxMpService.post(MESSAGE_MASS_SEND_URL, message.toJson()); + return WxMpMassSendResult.fromJson(responseContent); + } + + @Override + public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws WxErrorException { + String responseContent = this.wxMpService.post(MESSAGE_MASS_PREVIEW_URL, wxMpMassPreviewMessage.toJson()); + return WxMpMassSendResult.fromJson(responseContent); + } + + @Override + public void delete(Integer msgId, Integer articleIndex) throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("msg_id", msgId); + jsonObject.addProperty("article_idx", articleIndex); + this.wxMpService.post(MESSAGE_MASS_DELETE_URL, jsonObject.toString()); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java index 520f69ea0d..e5283a7b28 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java @@ -1,151 +1,151 @@ -package me.chanjar.weixin.mp.api.impl; - -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.util.fs.FileUtils; -import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; -import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; -import me.chanjar.weixin.common.util.json.WxGsonBuilder; -import me.chanjar.weixin.mp.api.WxMpMaterialService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.material.*; -import me.chanjar.weixin.mp.util.http.*; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -/** - * Created by Binary Wang on 2016/7/21. - */ -public class WxMpMaterialServiceImpl implements WxMpMaterialService { - - private WxMpService wxMpService; - - public WxMpMaterialServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) throws WxErrorException { - try { - return this.mediaUpload(mediaType, FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), fileType)); - } catch (IOException e) { - throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg(e.getMessage()).build(), e); - } - } - - @Override - public WxMediaUploadResult mediaUpload(String mediaType, File file) throws WxErrorException { - String url = String.format(MEDIA_UPLOAD_URL, mediaType); - return this.wxMpService.execute(MediaUploadRequestExecutor.create(this.wxMpService.getRequestHttp()), url, file); - } - - @Override - public File mediaDownload(String mediaId) throws WxErrorException { - return this.wxMpService.execute( - BaseMediaDownloadRequestExecutor.create(this.wxMpService.getRequestHttp(), this.wxMpService.getWxMpConfigStorage().getTmpDirFile()), - MEDIA_GET_URL, - "media_id=" + mediaId); - } - - @Override - public WxMediaImgUploadResult mediaImgUpload(File file) throws WxErrorException { - return this.wxMpService.execute(MediaImgUploadRequestExecutor.create(this.wxMpService.getRequestHttp()), IMG_UPLOAD_URL, file); - } - - @Override - public WxMpMaterialUploadResult materialFileUpload(String mediaType, WxMpMaterial material) throws WxErrorException { - String url = String.format(MATERIAL_ADD_URL, mediaType); - return this.wxMpService.execute(MaterialUploadRequestExecutor.create(this.wxMpService.getRequestHttp()), url, material); - } - - @Override - public WxMpMaterialUploadResult materialNewsUpload(WxMpMaterialNews news) throws WxErrorException { - if (news == null || news.isEmpty()) { - throw new IllegalArgumentException("news is empty!"); - } - String responseContent = this.wxMpService.post(NEWS_ADD_URL, news.toJson()); - return WxMpMaterialUploadResult.fromJson(responseContent); - } - - @Override - public InputStream materialImageOrVoiceDownload(String mediaId) throws WxErrorException { - return this.wxMpService.execute(MaterialVoiceAndImageDownloadRequestExecutor - .create(this.wxMpService.getRequestHttp(), this.wxMpService.getWxMpConfigStorage().getTmpDirFile()), MATERIAL_GET_URL, mediaId); - } - - @Override - public WxMpMaterialVideoInfoResult materialVideoInfo(String mediaId) throws WxErrorException { - return this.wxMpService.execute(MaterialVideoInfoRequestExecutor.create(this.wxMpService.getRequestHttp()), MATERIAL_GET_URL, mediaId); - } - - @Override - public WxMpMaterialNews materialNewsInfo(String mediaId) throws WxErrorException { - return this.wxMpService.execute(MaterialNewsInfoRequestExecutor.create(this.wxMpService.getRequestHttp()), MATERIAL_GET_URL, mediaId); - } - - @Override - public boolean materialNewsUpdate(WxMpMaterialArticleUpdate wxMpMaterialArticleUpdate) throws WxErrorException { - String responseText = this.wxMpService.post(NEWS_UPDATE_URL, wxMpMaterialArticleUpdate.toJson()); - WxError wxError = WxError.fromJson(responseText); - if (wxError.getErrorCode() == 0) { - return true; - } else { - throw new WxErrorException(wxError); - } - } - - @Override - public boolean materialDelete(String mediaId) throws WxErrorException { - return this.wxMpService.execute(MaterialDeleteRequestExecutor.create(this.wxMpService.getRequestHttp()), MATERIAL_DEL_URL, mediaId); - } - - @Override - public WxMpMaterialCountResult materialCount() throws WxErrorException { - String responseText = this.wxMpService.get(MATERIAL_GET_COUNT_URL, null); - WxError wxError = WxError.fromJson(responseText); - if (wxError.getErrorCode() == 0) { - return WxMpGsonBuilder.create().fromJson(responseText, WxMpMaterialCountResult.class); - } else { - throw new WxErrorException(wxError); - } - } - - @Override - public WxMpMaterialNewsBatchGetResult materialNewsBatchGet(int offset, int count) throws WxErrorException { - Map
- * 获取设备及用户信息- * - * @param wxMpShakeQuery 查询参数 - */ - @Override - public WxMpShakeInfoResult getShakeInfo(WxMpShakeQuery wxMpShakeQuery) throws WxErrorException { - String url = "https://api.weixin.qq.com/shakearound/user/getshakeinfo"; - String postData = wxMpShakeQuery.toJsonString(); - String responseContent = this.wxMpService.post(url, postData); - return WxMpShakeInfoResult.fromJson(responseContent); - } - - @Override - public WxMpShakeAroundPageAddResult pageAdd(WxMpShakeAroundPageAddQuery shakeAroundPageAddQuery) throws WxErrorException { - String url = "https://api.weixin.qq.com/shakearound/page/add"; - String postData = shakeAroundPageAddQuery.toJsonString(); - String responseContent = this.wxMpService.post(url, postData); - return WxMpShakeAroundPageAddResult.fromJson(responseContent); - } - - @Override - public WxError deviceBindPageQuery(WxMpShakeAroundDeviceBindPageQuery shakeAroundDeviceBindPageQuery) throws WxErrorException { - String url = "https://api.weixin.qq.com/shakearound/device/bindpage"; - String postData = shakeAroundDeviceBindPageQuery.toJsonString(); - String responseContent = this.wxMpService.post(url, postData); - return WxError.fromJson(responseContent); - } - - @Override - public WxMpShakeAroundRelationSearchResult relationSearch(WxMpShakeAroundRelationSearchQuery shakeAroundRelationSearchQuery) throws WxErrorException { - String url = "https://api.weixin.qq.com/shakearound/relation/search"; - String postData = shakeAroundRelationSearchQuery.toJsonString(); - String responseContent = this.wxMpService.post(url, postData); - return WxMpShakeAroundRelationSearchResult.fromJson(responseContent); - } -} +package me.chanjar.weixin.mp.api.impl; + +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpShakeService; +import me.chanjar.weixin.mp.bean.WxMpShakeInfoResult; +import me.chanjar.weixin.mp.bean.WxMpShakeQuery; +import me.chanjar.weixin.mp.bean.shake.*; + +/** + * Created by rememberber on 2017/6/5. + * + * @author rememberber + */ +public class WxMpShakeServiceImpl implements WxMpShakeService { + + private WxMpService wxMpService; + + public WxMpShakeServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + /** + *
- * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。 - * 详情请见: https://mp.weixin.qq.com/wiki?action=doc&id=mp1443447963 - * http请求方式: POST(请使用https协议) - * 接口地址:https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=ACCESS_TOKE - *
+ * 获取设备及用户信息+ * + * @param wxMpShakeQuery 查询参数 + */ + @Override + public WxMpShakeInfoResult getShakeInfo(WxMpShakeQuery wxMpShakeQuery) throws WxErrorException { + String url = "https://api.weixin.qq.com/shakearound/user/getshakeinfo"; + String postData = wxMpShakeQuery.toJsonString(); + String responseContent = this.wxMpService.post(url, postData); + return WxMpShakeInfoResult.fromJson(responseContent); + } + + @Override + public WxMpShakeAroundPageAddResult pageAdd(WxMpShakeAroundPageAddQuery shakeAroundPageAddQuery) throws WxErrorException { + String url = "https://api.weixin.qq.com/shakearound/page/add"; + String postData = shakeAroundPageAddQuery.toJsonString(); + String responseContent = this.wxMpService.post(url, postData); + return WxMpShakeAroundPageAddResult.fromJson(responseContent); + } + + @Override + public WxError deviceBindPageQuery(WxMpShakeAroundDeviceBindPageQuery shakeAroundDeviceBindPageQuery) throws WxErrorException { + String url = "https://api.weixin.qq.com/shakearound/device/bindpage"; + String postData = shakeAroundDeviceBindPageQuery.toJsonString(); + String responseContent = this.wxMpService.post(url, postData); + return WxError.fromJson(responseContent); + } + + @Override + public WxMpShakeAroundRelationSearchResult relationSearch(WxMpShakeAroundRelationSearchQuery shakeAroundRelationSearchQuery) throws WxErrorException { + String url = "https://api.weixin.qq.com/shakearound/relation/search"; + String postData = shakeAroundRelationSearchQuery.toJsonString(); + String responseContent = this.wxMpService.post(url, postData); + return WxMpShakeAroundRelationSearchResult.fromJson(responseContent); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java index 3901c61fbc..7c724537fb 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java @@ -1,123 +1,123 @@ -package me.chanjar.weixin.mp.bean.datacube; - -import com.google.gson.annotations.SerializedName; -import com.google.gson.reflect.TypeToken; -import lombok.Data; -import lombok.EqualsAndHashCode; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - -import java.util.List; - -/** - * 图文分析数据接口返回结果对象 - *
+ * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。 + * 详情请见: https://mp.weixin.qq.com/wiki?action=doc&id=mp1443447963 + * http请求方式: POST(请使用https协议) + * 接口地址:https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=ACCESS_TOKE + *
- * Created by Binary Wang on 2016/8/24.
- *
- * @author Binary Wang
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
- private static final long serialVersionUID = -9222452497954511765L;
-
- /**
- * ref_hour
- * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
- */
- @SerializedName("ref_hour")
- private Integer refHour;
-
- /**
- * msgid
- * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)
- * 和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,
- * 假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
- */
- @SerializedName("msgid")
- private String msgId;
-
- /**
- * title
- * 图文消息的标题
- */
- @SerializedName("title")
- private String title;
-
- /**
- * int_page_read_user
- * 图文页(点击群发图文卡片进入的页面)的阅读人数
- */
- @SerializedName("int_page_read_user")
- private Integer intPageReadUser;
-
- /**
- * int_page_read_count
- * 图文页的阅读次数
- */
- @SerializedName("int_page_read_count")
- private Integer intPageReadCount;
-
- /**
- * ori_page_read_user
- * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
- */
- @SerializedName("ori_page_read_user")
- private Integer oriPageReadUser;
-
- /**
- * ori_page_read_count
- * 原文页的阅读次数
- */
- @SerializedName("ori_page_read_count")
- private Integer oriPageReadCount;
-
- /**
- * share_scene
- * 分享的场景 1代表好友转发 2代表朋友圈 3代表腾讯微博 255代表其他
- */
- @SerializedName("share_scene")
- private Integer shareScene;
-
- /**
- * share_user
- * 分享的人数
- */
- @SerializedName("share_user")
- private Integer shareUser;
-
- /**
- * share_count
- * 分享的次数
- */
- @SerializedName("share_count")
- private Integer shareCount;
-
- /**
- * add_to_fav_user
- * 收藏的人数
- */
- @SerializedName("add_to_fav_user")
- private Integer addToFavUser;
-
- /**
- * add_to_fav_count
- * 收藏的次数
- */
- @SerializedName("add_to_fav_count")
- private Integer addToFavCount;
-
- /**
- * user_source
- * 在获取图文阅读分时数据时才有该字段,代表用户从哪里进入来阅读该图文。0:会话;1.好友;2.朋友圈;3.腾讯微博;4.历史消息页;5.其他
- */
- @SerializedName("user_source")
- private Integer userSource;
-
- public static List
+ * Created by Binary Wang on 2016/8/24.
+ *
+ * @author Binary Wang
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
+ private static final long serialVersionUID = -9222452497954511765L;
+
+ /**
+ * ref_hour
+ * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
+ */
+ @SerializedName("ref_hour")
+ private Integer refHour;
+
+ /**
+ * msgid
+ * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)
+ * 和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,
+ * 假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
+ */
+ @SerializedName("msgid")
+ private String msgId;
+
+ /**
+ * title
+ * 图文消息的标题
+ */
+ @SerializedName("title")
+ private String title;
+
+ /**
+ * int_page_read_user
+ * 图文页(点击群发图文卡片进入的页面)的阅读人数
+ */
+ @SerializedName("int_page_read_user")
+ private Integer intPageReadUser;
+
+ /**
+ * int_page_read_count
+ * 图文页的阅读次数
+ */
+ @SerializedName("int_page_read_count")
+ private Integer intPageReadCount;
+
+ /**
+ * ori_page_read_user
+ * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
+ */
+ @SerializedName("ori_page_read_user")
+ private Integer oriPageReadUser;
+
+ /**
+ * ori_page_read_count
+ * 原文页的阅读次数
+ */
+ @SerializedName("ori_page_read_count")
+ private Integer oriPageReadCount;
+
+ /**
+ * share_scene
+ * 分享的场景 1代表好友转发 2代表朋友圈 3代表腾讯微博 255代表其他
+ */
+ @SerializedName("share_scene")
+ private Integer shareScene;
+
+ /**
+ * share_user
+ * 分享的人数
+ */
+ @SerializedName("share_user")
+ private Integer shareUser;
+
+ /**
+ * share_count
+ * 分享的次数
+ */
+ @SerializedName("share_count")
+ private Integer shareCount;
+
+ /**
+ * add_to_fav_user
+ * 收藏的人数
+ */
+ @SerializedName("add_to_fav_user")
+ private Integer addToFavUser;
+
+ /**
+ * add_to_fav_count
+ * 收藏的次数
+ */
+ @SerializedName("add_to_fav_count")
+ private Integer addToFavCount;
+
+ /**
+ * user_source
+ * 在获取图文阅读分时数据时才有该字段,代表用户从哪里进入来阅读该图文。0:会话;1.好友;2.朋友圈;3.腾讯微博;4.历史消息页;5.其他
+ */
+ @SerializedName("user_source")
+ private Integer userSource;
+
+ public static List
- * Created by Binary Wang on 2016/8/30.
- *
- * @author Binary Wang
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
- private static final long serialVersionUID = 597734329161281398L;
-
- /**
- * ref_hour
- * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
- */
- @SerializedName("ref_hour")
- private Integer refHour;
-
- /**
- * callback_count
- * 通过服务器配置地址获得消息后,被动回复用户消息的次数
- */
- @SerializedName("callback_count")
- private Integer callbackCount;
-
- /**
- * fail_count
- * 上述动作的失败次数
- */
- @SerializedName("fail_count")
- private Integer failCount;
-
- /**
- * total_time_cost
- * 总耗时,除以callback_count即为平均耗时
- */
- @SerializedName("total_time_cost")
- private Integer totalTimeCost;
-
- /**
- * max_time_cost
- * 最大耗时
- */
- @SerializedName("max_time_cost")
- private Integer maxTimeCost;
-
- public static List
+ * Created by Binary Wang on 2016/8/30.
+ *
+ * @author Binary Wang
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
+ private static final long serialVersionUID = 597734329161281398L;
+
+ /**
+ * ref_hour
+ * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
+ */
+ @SerializedName("ref_hour")
+ private Integer refHour;
+
+ /**
+ * callback_count
+ * 通过服务器配置地址获得消息后,被动回复用户消息的次数
+ */
+ @SerializedName("callback_count")
+ private Integer callbackCount;
+
+ /**
+ * fail_count
+ * 上述动作的失败次数
+ */
+ @SerializedName("fail_count")
+ private Integer failCount;
+
+ /**
+ * total_time_cost
+ * 总耗时,除以callback_count即为平均耗时
+ */
+ @SerializedName("total_time_cost")
+ private Integer totalTimeCost;
+
+ /**
+ * max_time_cost
+ * 最大耗时
+ */
+ @SerializedName("max_time_cost")
+ private Integer maxTimeCost;
+
+ public static List>() {
- }.getType());
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 图文分析数据接口返回结果对象
+ *
>() {
+ }.getType());
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
index bef0e66d15..6c63e83231 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
@@ -1,50 +1,50 @@
-package me.chanjar.weixin.mp.bean.datacube;
-
-import com.google.gson.annotations.SerializedName;
-import com.google.gson.reflect.TypeToken;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-
-import java.util.List;
-
-/**
- * 图文分析数据接口返回结果对象.
- * Created by Binary Wang on 2016/8/24.
- *
- * @author Binary Wang
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
- private static final long serialVersionUID = -7634365687303052699L;
-
- /**
- * msgid.
- * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
- */
- @SerializedName("msgid")
- private String msgId;
-
- /**
- * title.
- * 图文消息的标题
- */
- @SerializedName("title")
- private String title;
-
- /**
- * details.
- * 详细信息
- */
- @SerializedName("details")
- private List
>() {
- }.getType());
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 图文分析数据接口返回结果对象.
+ * Created by Binary Wang on 2016/8/24.
+ *
+ * @author Binary Wang
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
+ private static final long serialVersionUID = -7634365687303052699L;
+
+ /**
+ * msgid.
+ * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
+ */
+ @SerializedName("msgid")
+ private String msgId;
+
+ /**
+ * title.
+ * 图文消息的标题
+ */
+ @SerializedName("title")
+ private String title;
+
+ /**
+ * details.
+ * 详细信息
+ */
+ @SerializedName("details")
+ private List
>() {
+ }.getType());
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
index df86ab4e15..8af64015b7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
@@ -1,35 +1,35 @@
-package me.chanjar.weixin.mp.bean.datacube;
-
-import com.google.gson.JsonParser;
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import me.chanjar.weixin.common.util.ToStringUtils;
-
-import java.io.Serializable;
-
-/**
- *
- * 统计接口的共用属性类.
- * Created by Binary Wang on 2016/8/25.
- *
- *
- * @author Binary Wang
- */
-@Data
-public abstract class WxDataCubeBaseResult implements Serializable {
- private static final long serialVersionUID = 8780389911053297600L;
- protected static final JsonParser JSON_PARSER = new JsonParser();
-
- /**
- * ref_date.
- * 数据的日期,需在begin_date和end_date之间
- */
- @SerializedName("ref_date")
- private String refDate;
-
- @Override
- public String toString() {
- return ToStringUtils.toSimpleString(this);
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.JsonParser;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.ToStringUtils;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 统计接口的共用属性类.
+ * Created by Binary Wang on 2016/8/25.
+ *
+ *
+ * @author Binary Wang
+ */
+@Data
+public abstract class WxDataCubeBaseResult implements Serializable {
+ private static final long serialVersionUID = 8780389911053297600L;
+ protected static final JsonParser JSON_PARSER = new JsonParser();
+
+ /**
+ * ref_date.
+ * 数据的日期,需在begin_date和end_date之间
+ */
+ @SerializedName("ref_date")
+ private String refDate;
+
+ @Override
+ public String toString() {
+ return ToStringUtils.toSimpleString(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
index b151c0089f..cf77b28575 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
@@ -1,65 +1,65 @@
-package me.chanjar.weixin.mp.bean.datacube;
-
-import com.google.gson.annotations.SerializedName;
-import com.google.gson.reflect.TypeToken;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-
-import java.util.List;
-
-/**
- * 接口分析数据接口返回结果对象
- * >() {
- }.getType());
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 接口分析数据接口返回结果对象
+ *
>() {
+ }.getType());
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
index 1e7e1f58c2..a786605c9e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
@@ -1,78 +1,78 @@
-package me.chanjar.weixin.mp.bean.datacube;
-
-import com.google.gson.annotations.SerializedName;
-import com.google.gson.reflect.TypeToken;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-
-import java.util.List;
-
-/**
- * 消息分析数据接口返回结果对象.
- * Created by Binary Wang on 2016/8/29.
- *
- * @author Binary Wang
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
- private static final long serialVersionUID = 6932121822150573659L;
-
- /**
- * ref_hour.
- * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
- */
- @SerializedName("ref_hour")
- private Integer refHour;
-
- /**
- * msg_type.
- * 消息类型,代表含义如下:1代表文字 2代表图片 3代表语音 4代表视频 6代表第三方应用消息(链接消息)
- */
- @SerializedName("msg_type")
- private Integer msgType;
-
- /**
- * msg_user.
- * 上行发送了(向公众号发送了)消息的用户数
- */
- @SerializedName("msg_user")
- private Integer msgUser;
-
- /**
- * msg_count.
- * 上行发送了消息的消息总数
- */
- @SerializedName("msg_count")
- private Integer msgCount;
-
- /**
- * count_interval.
- * 当日发送消息量分布的区间,0代表 “0”,1代表“1-5”,2代表“6-10”,3代表“10次以上”
- */
- @SerializedName("count_interval")
- private Integer countInterval;
-
- /**
- * int_page_read_count
- * 图文页的阅读次数
- */
- @SerializedName("int_page_read_count")
- private Integer intPageReadCount;
-
- /**
- * ori_page_read_user.
- * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
- */
- @SerializedName("ori_page_read_user")
- private Integer oriPageReadUser;
-
- public static List
>() {
- }.getType());
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 消息分析数据接口返回结果对象.
+ * Created by Binary Wang on 2016/8/29.
+ *
+ * @author Binary Wang
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
+ private static final long serialVersionUID = 6932121822150573659L;
+
+ /**
+ * ref_hour.
+ * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
+ */
+ @SerializedName("ref_hour")
+ private Integer refHour;
+
+ /**
+ * msg_type.
+ * 消息类型,代表含义如下:1代表文字 2代表图片 3代表语音 4代表视频 6代表第三方应用消息(链接消息)
+ */
+ @SerializedName("msg_type")
+ private Integer msgType;
+
+ /**
+ * msg_user.
+ * 上行发送了(向公众号发送了)消息的用户数
+ */
+ @SerializedName("msg_user")
+ private Integer msgUser;
+
+ /**
+ * msg_count.
+ * 上行发送了消息的消息总数
+ */
+ @SerializedName("msg_count")
+ private Integer msgCount;
+
+ /**
+ * count_interval.
+ * 当日发送消息量分布的区间,0代表 “0”,1代表“1-5”,2代表“6-10”,3代表“10次以上”
+ */
+ @SerializedName("count_interval")
+ private Integer countInterval;
+
+ /**
+ * int_page_read_count
+ * 图文页的阅读次数
+ */
+ @SerializedName("int_page_read_count")
+ private Integer intPageReadCount;
+
+ /**
+ * ori_page_read_user.
+ * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
+ */
+ @SerializedName("ori_page_read_user")
+ private Integer oriPageReadUser;
+
+ public static List
>() {
+ }.getType());
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/BaseResp.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/BaseResp.java
index 5c66b0cd60..207c1921b8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/BaseResp.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/BaseResp.java
@@ -1,31 +1,31 @@
-package me.chanjar.weixin.mp.bean.device;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * @author keungtung.
- * @date 10/12/2016
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class BaseResp extends AbstractDeviceBean {
- private static final long serialVersionUID = 4252655933699659073L;
-
- @SerializedName("base_info")
- private BaseInfo baseInfo;
- @SerializedName("errcode")
- private Integer errCode;
- @SerializedName("errmsg")
- private String errMsg;
-
- @Data
- private class BaseInfo {
- @SerializedName("device_type")
- private String deviceType;
-
- @SerializedName("device_id")
- private String deviceId;
- }
-}
+package me.chanjar.weixin.mp.bean.device;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author keungtung.
+ * @date 10/12/2016
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseResp extends AbstractDeviceBean {
+ private static final long serialVersionUID = 4252655933699659073L;
+
+ @SerializedName("base_info")
+ private BaseInfo baseInfo;
+ @SerializedName("errcode")
+ private Integer errCode;
+ @SerializedName("errmsg")
+ private String errMsg;
+
+ @Data
+ private class BaseInfo {
+ @SerializedName("device_type")
+ private String deviceType;
+
+ @SerializedName("device_id")
+ private String deviceId;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/RespMsg.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/RespMsg.java
index 601f848223..de9dccd429 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/RespMsg.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/RespMsg.java
@@ -1,21 +1,21 @@
-package me.chanjar.weixin.mp.bean.device;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- *
- * @author keungtung.
- * @date 10/12/2016
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class RespMsg extends AbstractDeviceBean {
- private static final long serialVersionUID = -4241272701707684136L;
-
- @SerializedName("ret_code")
- private Integer retCode;
- @SerializedName("error_info")
- private String errorInfo;
-}
+package me.chanjar.weixin.mp.bean.device;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ *
+ * @author keungtung.
+ * @date 10/12/2016
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class RespMsg extends AbstractDeviceBean {
+ private static final long serialVersionUID = -4241272701707684136L;
+
+ @SerializedName("ret_code")
+ private Integer retCode;
+ @SerializedName("error_info")
+ private String errorInfo;
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/TransMsgResp.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/TransMsgResp.java
index f2b35da5ea..289816a782 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/TransMsgResp.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/TransMsgResp.java
@@ -1,29 +1,29 @@
-package me.chanjar.weixin.mp.bean.device;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import me.chanjar.weixin.common.util.json.WxGsonBuilder;
-
-/**
- *
- * @author keungtung.
- * @date 14/12/2016
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class TransMsgResp extends AbstractDeviceBean {
- private static final long serialVersionUID = 5386954916622816491L;
-
- private Integer ret;
- @SerializedName("ret_info")
- private String retInfo;
- @SerializedName("errcode")
- private Integer errCode;
- @SerializedName("errmsg")
- private String errMsg;
-
- public static TransMsgResp fromJson(String json) {
- return WxGsonBuilder.create().fromJson(json, TransMsgResp.class);
- }
-}
+package me.chanjar.weixin.mp.bean.device;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+/**
+ *
+ * @author keungtung.
+ * @date 14/12/2016
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class TransMsgResp extends AbstractDeviceBean {
+ private static final long serialVersionUID = 5386954916622816491L;
+
+ private Integer ret;
+ @SerializedName("ret_info")
+ private String retInfo;
+ @SerializedName("errcode")
+ private Integer errCode;
+ @SerializedName("errmsg")
+ private String errMsg;
+
+ public static TransMsgResp fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, TransMsgResp.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/WxDeviceAuthorize.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/WxDeviceAuthorize.java
index 5e00c4faea..ed02aedc70 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/WxDeviceAuthorize.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/WxDeviceAuthorize.java
@@ -1,32 +1,32 @@
-package me.chanjar.weixin.mp.bean.device;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @author keungtung
- * @date 10/12/2016
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class WxDeviceAuthorize extends AbstractDeviceBean {
- private static final long serialVersionUID = 8786321356569903887L;
-
- @SerializedName("device_num")
- private String deviceNum;
- @SerializedName("op_type")
- private String opType;
- @SerializedName("product_id")
- private String productId;
- @SerializedName("device_list")
- private List
- * 菜单的响应动作类型.
- * view表示网页类型,
- * click表示点击类型,
- * miniprogram表示小程序类型
- *
- */
- private String type;
-
- /**
- * 菜单标题,不超过16个字节,子菜单不超过60个字节.
- */
- private String name;
-
- /**
- *
- * 菜单KEY值,用于消息接口推送,不超过128字节.
- * click等点击类型必须
- *
- */
- private String key;
-
- /**
- *
- * 网页链接.
- * 用户点击菜单可打开链接,不超过1024字节。type为miniprogram时,不支持小程序的老版本客户端将打开本url。
- * view、miniprogram类型必须
- *
- */
- private String url;
-
- /**
- *
- * 调用新增永久素材接口返回的合法media_id.
- * media_id类型和view_limited类型必须
- *
- */
- @SerializedName("media_id")
- private String mediaId;
-
- /**
- *
- * 小程序的appid.
- * miniprogram类型必须
- *
- */
- @SerializedName("appid")
- private String appId;
-
- /**
- *
- * 小程序的页面路径.
- * miniprogram类型必须
- *
- */
- @SerializedName("pagepath")
- private String pagePath;
-
- @SerializedName("sub_button")
- private List
+ * 菜单的响应动作类型.
+ * view表示网页类型,
+ * click表示点击类型,
+ * miniprogram表示小程序类型
+ *
+ */
+ private String type;
+
+ /**
+ * 菜单标题,不超过16个字节,子菜单不超过60个字节.
+ */
+ private String name;
+
+ /**
+ *
+ * 菜单KEY值,用于消息接口推送,不超过128字节.
+ * click等点击类型必须
+ *
+ */
+ private String key;
+
+ /**
+ *
+ * 网页链接.
+ * 用户点击菜单可打开链接,不超过1024字节。type为miniprogram时,不支持小程序的老版本客户端将打开本url。
+ * view、miniprogram类型必须
+ *
+ */
+ private String url;
+
+ /**
+ *
+ * 调用新增永久素材接口返回的合法media_id.
+ * media_id类型和view_limited类型必须
+ *
+ */
+ @SerializedName("media_id")
+ private String mediaId;
+
+ /**
+ *
+ * 小程序的appid.
+ * miniprogram类型必须
+ *
+ */
+ @SerializedName("appid")
+ private String appId;
+
+ /**
+ *
+ * 小程序的页面路径.
+ * miniprogram类型必须
+ *
+ */
+ @SerializedName("pagepath")
+ private String pagePath;
+
+ @SerializedName("sub_button")
+ private List
- * bean操作的一些工具类
- * Created by Binary Wang on 2016-10-21.
- *
- *
- * @author binarywang(Binary Wang)
- */
-public class BeanUtils {
- private static Logger log = LoggerFactory.getLogger(BeanUtils.class);
-
- /**
- * 检查bean里标记为@Required的field是否为空,为空则抛异常
- *
- * @param bean 要检查的bean对象
- * @throws WxErrorException
- */
- public static void checkRequiredFields(Object bean) throws WxErrorException {
- List
+ * bean操作的一些工具类
+ * Created by Binary Wang on 2016-10-21.
+ *
+ *
+ * @author binarywang(Binary Wang)
+ */
+public class BeanUtils {
+ private static Logger log = LoggerFactory.getLogger(BeanUtils.class);
+
+ /**
+ * 检查bean里标记为@Required的field是否为空,为空则抛异常
+ *
+ * @param bean 要检查的bean对象
+ * @throws WxErrorException
+ */
+ public static void checkRequiredFields(Object bean) throws WxErrorException {
+ List
- * 三种http框架的response代理类,方便提取公共方法
- * Created by Binary Wang on 2017-8-3.
- *
- *
- * @author Binary Wang
- */
-public class HttpResponseProxy {
- private static final Pattern PATTERN = Pattern.compile(".*filename=\"(.*)\"");
-
- private CloseableHttpResponse apacheHttpResponse;
- private HttpResponse joddHttpResponse;
- private Response okHttpResponse;
-
- public HttpResponseProxy(CloseableHttpResponse apacheHttpResponse) {
- this.apacheHttpResponse = apacheHttpResponse;
- }
-
- public HttpResponseProxy(HttpResponse joddHttpResponse) {
- this.joddHttpResponse = joddHttpResponse;
- }
-
- public HttpResponseProxy(Response okHttpResponse) {
- this.okHttpResponse = okHttpResponse;
- }
-
- public String getFileName() throws WxErrorException {
- //由于对象只能由一个构造方法实现,因此三个response对象必定且只有一个不为空
- if (this.apacheHttpResponse != null) {
- return this.getFileName(this.apacheHttpResponse);
- }
-
- if (this.joddHttpResponse != null) {
- return this.getFileName(this.joddHttpResponse);
- }
-
- if (this.okHttpResponse != null) {
- return this.getFileName(this.okHttpResponse);
- }
-
- //cannot happen
- return null;
- }
-
- private String getFileName(CloseableHttpResponse response) throws WxErrorException {
- Header[] contentDispositionHeader = response.getHeaders("Content-disposition");
- if (contentDispositionHeader == null || contentDispositionHeader.length == 0) {
- throw new WxErrorException(WxError.builder().errorMsg("无法获取到文件名").build());
- }
-
- return this.extractFileNameFromContentString(contentDispositionHeader[0].getValue());
- }
-
- private String getFileName(HttpResponse response) throws WxErrorException {
- String content = response.header("Content-disposition");
- return this.extractFileNameFromContentString(content);
- }
-
- private String getFileName(Response response) throws WxErrorException {
- String content = response.header("Content-disposition");
- return this.extractFileNameFromContentString(content);
- }
-
- private String extractFileNameFromContentString(String content) throws WxErrorException {
- if (content == null || content.length() == 0) {
- throw new WxErrorException(WxError.builder().errorMsg("无法获取到文件名").build());
- }
-
- Matcher m = PATTERN.matcher(content);
- if (m.matches()) {
- return m.group(1);
- }
-
- throw new WxErrorException(WxError.builder().errorMsg("无法获取到文件名").build());
- }
-
-}
+package me.chanjar.weixin.common.util.http;
+
+import jodd.http.HttpResponse;
+import me.chanjar.weixin.common.bean.result.WxError;
+import me.chanjar.weixin.common.exception.WxErrorException;
+import okhttp3.Response;
+import org.apache.http.Header;
+import org.apache.http.client.methods.CloseableHttpResponse;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * 三种http框架的response代理类,方便提取公共方法
+ * Created by Binary Wang on 2017-8-3.
+ *
+ *
+ * @author Binary Wang
+ */
+public class HttpResponseProxy {
+ private static final Pattern PATTERN = Pattern.compile(".*filename=\"(.*)\"");
+
+ private CloseableHttpResponse apacheHttpResponse;
+ private HttpResponse joddHttpResponse;
+ private Response okHttpResponse;
+
+ public HttpResponseProxy(CloseableHttpResponse apacheHttpResponse) {
+ this.apacheHttpResponse = apacheHttpResponse;
+ }
+
+ public HttpResponseProxy(HttpResponse joddHttpResponse) {
+ this.joddHttpResponse = joddHttpResponse;
+ }
+
+ public HttpResponseProxy(Response okHttpResponse) {
+ this.okHttpResponse = okHttpResponse;
+ }
+
+ public String getFileName() throws WxErrorException {
+ //由于对象只能由一个构造方法实现,因此三个response对象必定且只有一个不为空
+ if (this.apacheHttpResponse != null) {
+ return this.getFileName(this.apacheHttpResponse);
+ }
+
+ if (this.joddHttpResponse != null) {
+ return this.getFileName(this.joddHttpResponse);
+ }
+
+ if (this.okHttpResponse != null) {
+ return this.getFileName(this.okHttpResponse);
+ }
+
+ //cannot happen
+ return null;
+ }
+
+ private String getFileName(CloseableHttpResponse response) throws WxErrorException {
+ Header[] contentDispositionHeader = response.getHeaders("Content-disposition");
+ if (contentDispositionHeader == null || contentDispositionHeader.length == 0) {
+ throw new WxErrorException(WxError.builder().errorMsg("无法获取到文件名").build());
+ }
+
+ return this.extractFileNameFromContentString(contentDispositionHeader[0].getValue());
+ }
+
+ private String getFileName(HttpResponse response) throws WxErrorException {
+ String content = response.header("Content-disposition");
+ return this.extractFileNameFromContentString(content);
+ }
+
+ private String getFileName(Response response) throws WxErrorException {
+ String content = response.header("Content-disposition");
+ return this.extractFileNameFromContentString(content);
+ }
+
+ private String extractFileNameFromContentString(String content) throws WxErrorException {
+ if (content == null || content.length() == 0) {
+ throw new WxErrorException(WxError.builder().errorMsg("无法获取到文件名").build());
+ }
+
+ Matcher m = PATTERN.matcher(content);
+ if (m.matches()) {
+ return m.group(1);
+ }
+
+ throw new WxErrorException(WxError.builder().errorMsg("无法获取到文件名").build());
+ }
+
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
index 811a631401..1a8a292b9f 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
@@ -1,59 +1,59 @@
-package me.chanjar.weixin.common.util.http.apache;
-
-import me.chanjar.weixin.common.bean.result.WxError;
-import me.chanjar.weixin.common.exception.WxErrorException;
-import me.chanjar.weixin.common.util.http.RequestHttp;
-import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
-import org.apache.http.Consts;
-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.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-
-import java.io.IOException;
-
-/**
- * Created by ecoolper on 2017/5/4.
- */
-public class ApacheSimplePostRequestExecutor extends SimplePostRequestExecutor
- * 请使用
- * {@link WxConsts.KefuMsgType#TEXT}
- * {@link WxConsts.KefuMsgType#IMAGE}
- * {@link WxConsts.KefuMsgType#VOICE}
- * {@link WxConsts.KefuMsgType#MUSIC}
- * {@link WxConsts.KefuMsgType#VIDEO}
- * {@link WxConsts.KefuMsgType#NEWS}
- * {@link WxConsts.KefuMsgType#MPNEWS}
- *
- *
- * @param msgType 消息类型
- */
- public void setMsgType(String msgType) {
- this.msgType = msgType;
- }
-
- public String toJson() {
- return WxCpGsonBuilder.INSTANCE.create().toJson(this);
- }
-
-}
+package me.chanjar.weixin.cp.bean;
+
+import lombok.Data;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
+import me.chanjar.weixin.cp.bean.messagebuilder.*;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 消息.
+ *
+ * @author Daniel Qian
+ */
+@Data
+public class WxCpMessage implements Serializable {
+ private static final long serialVersionUID = -2082278303476631708L;
+
+ private String toUser;
+ private String toParty;
+ private String toTag;
+ private Integer agentId;
+ private String msgType;
+ private String content;
+ private String mediaId;
+ private String thumbMediaId;
+ private String title;
+ private String description;
+ private String musicUrl;
+ private String hqMusicUrl;
+ private String safe;
+ private String url;
+ private List
+ * 请使用
+ * {@link WxConsts.KefuMsgType#TEXT}
+ * {@link WxConsts.KefuMsgType#IMAGE}
+ * {@link WxConsts.KefuMsgType#VOICE}
+ * {@link WxConsts.KefuMsgType#MUSIC}
+ * {@link WxConsts.KefuMsgType#VIDEO}
+ * {@link WxConsts.KefuMsgType#NEWS}
+ * {@link WxConsts.KefuMsgType#MPNEWS}
+ *
+ *
+ * @param msgType 消息类型
+ */
+ public void setMsgType(String msgType) {
+ this.msgType = msgType;
+ }
+
+ public String toJson() {
+ return WxCpGsonBuilder.INSTANCE.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessageSendResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessageSendResult.java
index d8159c0fd8..e54a01eccd 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessageSendResult.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessageSendResult.java
@@ -1,68 +1,68 @@
-package me.chanjar.weixin.cp.bean;
-
-import com.google.common.base.Splitter;
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import me.chanjar.weixin.common.util.ToStringUtils;
-import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * 消息发送结果对象类.
- * Created by Binary Wang on 2017-6-22.
- *
- * @author Binary Wang
- */
-@Data
-public class WxCpMessageSendResult implements Serializable {
- private static final long serialVersionUID = 916455987193190004L;
-
- @Override
- public String toString() {
- return ToStringUtils.toSimpleString(this);
- }
-
- public static WxCpMessageSendResult fromJson(String json) {
- return WxCpGsonBuilder.INSTANCE.create().fromJson(json, WxCpMessageSendResult.class);
- }
-
- @SerializedName("errcode")
- private Integer errCode;
-
- @SerializedName("errmsg")
- private String errMsg;
-
- @SerializedName("invaliduser")
- private String invalidUser;
-
- @SerializedName("invalidparty")
- private String invalidParty;
-
- @SerializedName("invalidtag")
- private String invalidTag;
-
-
- public List
- * 微信推送过来的消息,也是同步回复给用户的消息,xml格式
- * 相关字段的解释看微信开发者文档:
- * http://mp.weixin.qq.com/wiki/index.php?title=接收普通消息
- * http://mp.weixin.qq.com/wiki/index.php?title=接收事件推送
- * http://mp.weixin.qq.com/wiki/index.php?title=接收语音识别结果
- *
- *
- * @author Daniel Qian
- */
-@XStreamAlias("xml")
-@Data
-public class WxCpXmlMessage implements Serializable {
- private static final long serialVersionUID = -1042994982179476410L;
-
- ///////////////////////
- // 以下都是微信推送过来的消息的xml的element所对应的属性
- ///////////////////////
-
- @XStreamAlias("AgentID")
- private Integer agentId;
-
- @XStreamAlias("ToUserName")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String toUserName;
-
- @XStreamAlias("FromUserName")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String fromUserName;
-
- @XStreamAlias("CreateTime")
- private Long createTime;
-
- @XStreamAlias("MsgType")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String msgType;
-
- @XStreamAlias("Content")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String content;
-
- @XStreamAlias("MsgId")
- private Long msgId;
-
- @XStreamAlias("PicUrl")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String picUrl;
-
- @XStreamAlias("MediaId")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String mediaId;
-
- @XStreamAlias("Format")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String format;
-
- @XStreamAlias("ThumbMediaId")
- @XStreamConverter(value = 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(value = XStreamCDataConverter.class)
- private String label;
-
- @XStreamAlias("Title")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String title;
-
- @XStreamAlias("Description")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String description;
-
- @XStreamAlias("Url")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String url;
-
- @XStreamAlias("Event")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String event;
-
- @XStreamAlias("EventKey")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String eventKey;
-
- @XStreamAlias("Ticket")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String ticket;
-
- @XStreamAlias("Latitude")
- private Double latitude;
-
- @XStreamAlias("Longitude")
- private Double longitude;
-
- @XStreamAlias("Precision")
- private Double precision;
-
- @XStreamAlias("Recognition")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String recognition;
-
- ///////////////////////////////////////
- // 群发消息返回的结果
- ///////////////////////////////////////
- /**
- * 群发的结果.
- */
- @XStreamAlias("Status")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String status;
- /**
- * group_id下粉丝数;或者openid_list中的粉丝数.
- */
- @XStreamAlias("TotalCount")
- private Integer totalCount;
- /**
- * 过滤.
- * (过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,filterCount = sentCount + errorCount
- */
- @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 WxCpXmlMessage fromXml(String xml) {
- //修改微信变态的消息内容格式,方便解析
- xml = xml.replace("
- * 当接受用户消息时,可能会获得以下值:
- * {@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}
- *
- */
- public String getMsgType() {
- return this.msgType;
- }
-
- /**
- *
- * 当发送消息的时候使用:
- * {@link WxConsts.XmlMsgType#TEXT}
- * {@link WxConsts.XmlMsgType#IMAGE}
- * {@link WxConsts.XmlMsgType#VOICE}
- * {@link WxConsts.XmlMsgType#VIDEO}
- * {@link WxConsts.XmlMsgType#NEWS}
- *
- */
- public void setMsgType(String msgType) {
- this.msgType = msgType;
- }
-
- @Override
- public String toString() {
- return ToStringUtils.toSimpleString(this);
- }
-
- @Data
- @XStreamAlias("ScanCodeInfo")
- public static class ScanCodeInfo {
-
- /**
- * 扫描类型,一般是qrcode.
- */
- @XStreamAlias("ScanType")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String scanType;
-
- /**
- * 扫描结果,即二维码对应的字符串信息.
- */
- @XStreamAlias("ScanResult")
- @XStreamConverter(value = XStreamCDataConverter.class)
- private String scanResult;
- }
-
- @Data
- @XStreamAlias("SendPicsInfo")
- public static class SendPicsInfo {
- @XStreamAlias("PicList")
- protected final List+ * 微信推送过来的消息,也是同步回复给用户的消息,xml格式 + * 相关字段的解释看微信开发者文档: + * http://mp.weixin.qq.com/wiki/index.php?title=接收普通消息 + * http://mp.weixin.qq.com/wiki/index.php?title=接收事件推送 + * http://mp.weixin.qq.com/wiki/index.php?title=接收语音识别结果 + *+ * + * @author Daniel Qian + */ +@XStreamAlias("xml") +@Data +public class WxCpXmlMessage implements Serializable { + private static final long serialVersionUID = -1042994982179476410L; + + /////////////////////// + // 以下都是微信推送过来的消息的xml的element所对应的属性 + /////////////////////// + + @XStreamAlias("AgentID") + private Integer agentId; + + @XStreamAlias("ToUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + private String toUserName; + + @XStreamAlias("FromUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + private String fromUserName; + + @XStreamAlias("CreateTime") + private Long createTime; + + @XStreamAlias("MsgType") + @XStreamConverter(value = XStreamCDataConverter.class) + private String msgType; + + @XStreamAlias("Content") + @XStreamConverter(value = XStreamCDataConverter.class) + private String content; + + @XStreamAlias("MsgId") + private Long msgId; + + @XStreamAlias("PicUrl") + @XStreamConverter(value = XStreamCDataConverter.class) + private String picUrl; + + @XStreamAlias("MediaId") + @XStreamConverter(value = XStreamCDataConverter.class) + private String mediaId; + + @XStreamAlias("Format") + @XStreamConverter(value = XStreamCDataConverter.class) + private String format; + + @XStreamAlias("ThumbMediaId") + @XStreamConverter(value = 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(value = XStreamCDataConverter.class) + private String label; + + @XStreamAlias("Title") + @XStreamConverter(value = XStreamCDataConverter.class) + private String title; + + @XStreamAlias("Description") + @XStreamConverter(value = XStreamCDataConverter.class) + private String description; + + @XStreamAlias("Url") + @XStreamConverter(value = XStreamCDataConverter.class) + private String url; + + @XStreamAlias("Event") + @XStreamConverter(value = XStreamCDataConverter.class) + private String event; + + @XStreamAlias("EventKey") + @XStreamConverter(value = XStreamCDataConverter.class) + private String eventKey; + + @XStreamAlias("Ticket") + @XStreamConverter(value = XStreamCDataConverter.class) + private String ticket; + + @XStreamAlias("Latitude") + private Double latitude; + + @XStreamAlias("Longitude") + private Double longitude; + + @XStreamAlias("Precision") + private Double precision; + + @XStreamAlias("Recognition") + @XStreamConverter(value = XStreamCDataConverter.class) + private String recognition; + + /////////////////////////////////////// + // 群发消息返回的结果 + /////////////////////////////////////// + /** + * 群发的结果. + */ + @XStreamAlias("Status") + @XStreamConverter(value = XStreamCDataConverter.class) + private String status; + /** + * group_id下粉丝数;或者openid_list中的粉丝数. + */ + @XStreamAlias("TotalCount") + private Integer totalCount; + /** + * 过滤. + * (过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,filterCount = sentCount + errorCount + */ + @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 WxCpXmlMessage fromXml(String xml) { + //修改微信变态的消息内容格式,方便解析 + xml = xml.replace("
+ * 当接受用户消息时,可能会获得以下值:
+ * {@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}
+ *
+ */
+ public String getMsgType() {
+ return this.msgType;
+ }
+
+ /**
+ *
+ * 当发送消息的时候使用:
+ * {@link WxConsts.XmlMsgType#TEXT}
+ * {@link WxConsts.XmlMsgType#IMAGE}
+ * {@link WxConsts.XmlMsgType#VOICE}
+ * {@link WxConsts.XmlMsgType#VIDEO}
+ * {@link WxConsts.XmlMsgType#NEWS}
+ *
+ */
+ public void setMsgType(String msgType) {
+ this.msgType = msgType;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringUtils.toSimpleString(this);
+ }
+
+ @Data
+ @XStreamAlias("ScanCodeInfo")
+ public static class ScanCodeInfo {
+
+ /**
+ * 扫描类型,一般是qrcode.
+ */
+ @XStreamAlias("ScanType")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ private String scanType;
+
+ /**
+ * 扫描结果,即二维码对应的字符串信息.
+ */
+ @XStreamAlias("ScanResult")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ private String scanResult;
+ }
+
+ @Data
+ @XStreamAlias("SendPicsInfo")
+ public static class SendPicsInfo {
+ @XStreamAlias("PicList")
+ protected final List- * Created by BinaryWang on 2017/3/27. - *- * - * @author Binary Wang - */ -@Data -@Builder(builderMethodName = "newBuilder") -public class MpnewsArticle implements Serializable { - private static final long serialVersionUID = 6985871812170756481L; - - private String title; - private String thumbMediaId; - private String author; - private String contentSourceUrl; - private String content; - private String digest; - private String showCoverPic; - -} +package me.chanjar.weixin.cp.bean.article; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * Created by BinaryWang on 2017/3/27. + *+ * + * @author Binary Wang + */ +@Data +@Builder(builderMethodName = "newBuilder") +public class MpnewsArticle implements Serializable { + private static final long serialVersionUID = 6985871812170756481L; + + private String title; + private String thumbMediaId; + private String author; + private String contentSourceUrl; + private String content; + private String digest; + private String showCoverPic; + +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java index 5accf3b42d..7f10d363b4 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java @@ -1,23 +1,23 @@ -package me.chanjar.weixin.cp.bean.article; - -import lombok.Data; - -import java.io.Serializable; - -/** - *
- * Created by BinaryWang on 2017/3/27. - *- * - * @author Binary Wang - */ -@Data -public class NewArticle implements Serializable { - private static final long serialVersionUID = 4087852055781140659L; - - private String title; - private String description; - private String url; - private String picUrl; - -} +package me.chanjar.weixin.cp.bean.article; + +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * Created by BinaryWang on 2017/3/27. + *+ * + * @author Binary Wang + */ +@Data +public class NewArticle implements Serializable { + private static final long serialVersionUID = 4087852055781140659L; + + private String title; + private String description; + private String url; + private String picUrl; + +} diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java index 1e307f0146..6d4e8ce893 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java @@ -1,68 +1,68 @@ -package me.chanjar.weixin.cp.api; - -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.util.http.RequestExecutor; -import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -@Test -public class WxCpBusyRetryTest { - - @DataProvider(name = "getService") - public Object[][] getService() { - WxCpService service = new WxCpServiceImpl() { - - @Override - public synchronized
- * lineColor 包装类 - * 用于描述二维码(小程序码)颜色(RGB参数值), - * 详情请查看文档 https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html - *- * @author Element - */ -@Data -@AllArgsConstructor -public class WxMaCodeLineColor { - private String r = "0", g = "0", b = "0"; -} +package cn.binarywang.wx.miniapp.bean; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + *
+ * lineColor 包装类 + * 用于描述二维码(小程序码)颜色(RGB参数值), + * 详情请查看文档 https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html + *+ * @author Element + */ +@Data +@AllArgsConstructor +public class WxMaCodeLineColor { + private String r = "0", g = "0", b = "0"; +} 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 50f6f4bba4..7d3e2d8de6 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,36 +1,36 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * {"session_key":"nzoqhc3OnwHzeTxJs+inbQ==","expires_in":2592000,"openid":"oVBkZ0aYgDMDIywRdgPW8-joxXc4"} - * - * @author Binary Wang - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class WxMaJscode2SessionResult implements Serializable { - private static final long serialVersionUID = -1060216618475607933L; - - @SerializedName("session_key") - private String sessionKey; - - @SerializedName("expires_in") - private Integer expiresin; - - @SerializedName("openid") - private String openid; - - @SerializedName("unionid") - private String unionid; - - public static WxMaJscode2SessionResult fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaJscode2SessionResult.class); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * {"session_key":"nzoqhc3OnwHzeTxJs+inbQ==","expires_in":2592000,"openid":"oVBkZ0aYgDMDIywRdgPW8-joxXc4"} + * + * @author Binary Wang + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxMaJscode2SessionResult implements Serializable { + private static final long serialVersionUID = -1060216618475607933L; + + @SerializedName("session_key") + private String sessionKey; + + @SerializedName("expires_in") + private Integer expiresin; + + @SerializedName("openid") + private String openid; + + @SerializedName("unionid") + private String unionid; + + public static WxMaJscode2SessionResult fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaJscode2SessionResult.class); + } + +} 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 3c7e5f1f6d..ec1728db60 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 @@ -1,45 +1,45 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.builder.ImageBuilder; -import cn.binarywang.wx.miniapp.builder.TextBuilder; -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.Data; - -import java.io.Serializable; - -/** - * 客服消息 - * - * @author Binary Wang - */ -@Data -public class WxMaKefuMessage implements Serializable { - private static final long serialVersionUID = -9196732086954365246L; - - private String toUser; - private String msgType; - private String content; - private String mediaId; - private String thumbMediaId; - private String title; - private String description; - - /** - * 获得文本消息builder - */ - public static TextBuilder newTextBuilder() { - return new TextBuilder(); - } - - /** - * 获得图片消息builder - */ - public static ImageBuilder newImageBuilder() { - return new ImageBuilder(); - } - - public String toJson() { - return WxMaGsonBuilder.create().toJson(this); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.builder.ImageBuilder; +import cn.binarywang.wx.miniapp.builder.TextBuilder; +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.Data; + +import java.io.Serializable; + +/** + * 客服消息 + * + * @author Binary Wang + */ +@Data +public class WxMaKefuMessage implements Serializable { + private static final long serialVersionUID = -9196732086954365246L; + + private String toUser; + private String msgType; + private String content; + private String mediaId; + private String thumbMediaId; + private String title; + private String description; + + /** + * 获得文本消息builder + */ + public static TextBuilder newTextBuilder() { + return new TextBuilder(); + } + + /** + * 获得图片消息builder + */ + public static ImageBuilder newImageBuilder() { + return new ImageBuilder(); + } + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + +} 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 2bd47d2e57..cb1fed6923 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 @@ -1,151 +1,151 @@ -package cn.binarywang.wx.miniapp.bean; - -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.util.xml.XStreamTransformer; -import com.google.gson.annotations.SerializedName; -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamConverter; -import lombok.Data; -import me.chanjar.weixin.common.util.ToStringUtils; -import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; -import org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.nio.charset.StandardCharsets; - -/** - * @author Binary Wang - */ -@XStreamAlias("xml") -@Data -public class WxMaMessage implements Serializable { - private static final long serialVersionUID = -3586245291677274914L; - - @SerializedName("Encrypt") - @XStreamAlias("Encrypt") - @XStreamConverter(value = XStreamCDataConverter.class) - private String encrypt; - - @SerializedName("ToUserName") - @XStreamAlias("ToUserName") - @XStreamConverter(value = XStreamCDataConverter.class) - private String toUser; - - @SerializedName("FromUserName") - @XStreamAlias("FromUserName") - @XStreamConverter(value = XStreamCDataConverter.class) - private String fromUser; - - @SerializedName("CreateTime") - @XStreamAlias("CreateTime") - @XStreamConverter(value = XStreamCDataConverter.class) - private Integer createTime; - - @SerializedName("MsgDataFormat") - @XStreamAlias("MsgDataFormat") - @XStreamConverter(value = XStreamCDataConverter.class) - private String msgType; - - // 文本消息 - @SerializedName("Content") - @XStreamAlias("Content") - @XStreamConverter(value = XStreamCDataConverter.class) - private String content; - - @SerializedName("MsgId") - @XStreamAlias("MsgId") - @XStreamConverter(value = XStreamCDataConverter.class) - private Long msgId; - - // 图片消息 - @SerializedName("PicUrl") - @XStreamAlias("PicUrl") - @XStreamConverter(value = XStreamCDataConverter.class) - private String picUrl; - - @SerializedName("MediaId") - @XStreamAlias("MediaId") - @XStreamConverter(value = XStreamCDataConverter.class) - private String mediaId; - - // 事件消息 - @SerializedName("Event") - @XStreamAlias("Event") - @XStreamConverter(value = XStreamCDataConverter.class) - private String event; - - @SerializedName("SessionFrom") - @XStreamAlias("SessionFrom") - @XStreamConverter(value = XStreamCDataConverter.class) - private String sessionFrom; - - public static WxMaMessage fromXml(String xml) { - return XStreamTransformer.fromXml(WxMaMessage.class, xml); - } - - public static WxMaMessage fromXml(InputStream is) { - return XStreamTransformer.fromXml(WxMaMessage.class, is); - } - - /** - * 从加密字符串转换 - * - * @param encryptedXml 密文 - * @param wxMaConfig 配置存储器对象 - * @param timestamp 时间戳 - * @param nonce 随机串 - * @param msgSignature 签名串 - */ - public static WxMaMessage fromEncryptedXml(String encryptedXml, - WxMaConfig wxMaConfig, String timestamp, String nonce, - String msgSignature) { - String plainText = new WxMaCryptUtils(wxMaConfig).decrypt(msgSignature, timestamp, nonce, encryptedXml); - return fromXml(plainText); - } - - public static WxMaMessage fromEncryptedXml(InputStream is, WxMaConfig wxMaConfig, String timestamp, - String nonce, String msgSignature) { - try { - return fromEncryptedXml(IOUtils.toString(is, StandardCharsets.UTF_8), wxMaConfig, - timestamp, nonce, msgSignature); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static WxMaMessage fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaMessage.class); - } - - public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config) { - try { - WxMaMessage encryptedMessage = fromJson(encryptedJson); - String plainText = new WxMaCryptUtils(config).decrypt(encryptedMessage.getEncrypt()); - return fromJson(plainText); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig config) { - try { - return fromEncryptedJson(IOUtils.toString(inputStream, StandardCharsets.UTF_8), config); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public String toString() { - return ToStringUtils.toSimpleString(this); - } - - public String toJson() { - return WxMaGsonBuilder.create().toJson(this); - } - -} +package cn.binarywang.wx.miniapp.bean; + +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.util.xml.XStreamTransformer; +import com.google.gson.annotations.SerializedName; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamConverter; +import lombok.Data; +import me.chanjar.weixin.common.util.ToStringUtils; +import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; + +/** + * @author Binary Wang + */ +@XStreamAlias("xml") +@Data +public class WxMaMessage implements Serializable { + private static final long serialVersionUID = -3586245291677274914L; + + @SerializedName("Encrypt") + @XStreamAlias("Encrypt") + @XStreamConverter(value = XStreamCDataConverter.class) + private String encrypt; + + @SerializedName("ToUserName") + @XStreamAlias("ToUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + private String toUser; + + @SerializedName("FromUserName") + @XStreamAlias("FromUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + private String fromUser; + + @SerializedName("CreateTime") + @XStreamAlias("CreateTime") + @XStreamConverter(value = XStreamCDataConverter.class) + private Integer createTime; + + @SerializedName("MsgDataFormat") + @XStreamAlias("MsgDataFormat") + @XStreamConverter(value = XStreamCDataConverter.class) + private String msgType; + + // 文本消息 + @SerializedName("Content") + @XStreamAlias("Content") + @XStreamConverter(value = XStreamCDataConverter.class) + private String content; + + @SerializedName("MsgId") + @XStreamAlias("MsgId") + @XStreamConverter(value = XStreamCDataConverter.class) + private Long msgId; + + // 图片消息 + @SerializedName("PicUrl") + @XStreamAlias("PicUrl") + @XStreamConverter(value = XStreamCDataConverter.class) + private String picUrl; + + @SerializedName("MediaId") + @XStreamAlias("MediaId") + @XStreamConverter(value = XStreamCDataConverter.class) + private String mediaId; + + // 事件消息 + @SerializedName("Event") + @XStreamAlias("Event") + @XStreamConverter(value = XStreamCDataConverter.class) + private String event; + + @SerializedName("SessionFrom") + @XStreamAlias("SessionFrom") + @XStreamConverter(value = XStreamCDataConverter.class) + private String sessionFrom; + + public static WxMaMessage fromXml(String xml) { + return XStreamTransformer.fromXml(WxMaMessage.class, xml); + } + + public static WxMaMessage fromXml(InputStream is) { + return XStreamTransformer.fromXml(WxMaMessage.class, is); + } + + /** + * 从加密字符串转换 + * + * @param encryptedXml 密文 + * @param wxMaConfig 配置存储器对象 + * @param timestamp 时间戳 + * @param nonce 随机串 + * @param msgSignature 签名串 + */ + public static WxMaMessage fromEncryptedXml(String encryptedXml, + WxMaConfig wxMaConfig, String timestamp, String nonce, + String msgSignature) { + String plainText = new WxMaCryptUtils(wxMaConfig).decrypt(msgSignature, timestamp, nonce, encryptedXml); + return fromXml(plainText); + } + + public static WxMaMessage fromEncryptedXml(InputStream is, WxMaConfig wxMaConfig, String timestamp, + String nonce, String msgSignature) { + try { + return fromEncryptedXml(IOUtils.toString(is, StandardCharsets.UTF_8), wxMaConfig, + timestamp, nonce, msgSignature); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static WxMaMessage fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaMessage.class); + } + + public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config) { + try { + WxMaMessage encryptedMessage = fromJson(encryptedJson); + String plainText = new WxMaCryptUtils(config).decrypt(encryptedMessage.getEncrypt()); + return fromJson(plainText); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static WxMaMessage fromEncryptedJson(InputStream inputStream, WxMaConfig config) { + try { + return fromEncryptedJson(IOUtils.toString(inputStream, StandardCharsets.UTF_8), config); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public String toString() { + return ToStringUtils.toSimpleString(this); + } + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + +} 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 87aa3f8bdf..5c17cd1e58 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,32 +1,32 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * @author Binary Wang - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class WxMaQrcode extends AbstractWxMaQrcodeWrapper implements Serializable { - private static final long serialVersionUID = 5777119669111011584L; - private String path; - private int width = 430; - - public WxMaQrcode(String path, int width) { - this.path = path; - this.width = width; - } - - public static WxMaQrcode fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaQrcode.class); - } - - @Override - public String toString() { - return WxMaGsonBuilder.create().toJson(this); - } -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * @author Binary Wang + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxMaQrcode extends AbstractWxMaQrcodeWrapper implements Serializable { + private static final long serialVersionUID = 5777119669111011584L; + private String path; + private int width = 430; + + public WxMaQrcode(String path, int width) { + this.path = path; + this.width = width; + } + + public static WxMaQrcode fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaQrcode.class); + } + + @Override + public String toString() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java index 3e9760395e..32268b4c4b 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java @@ -1,108 +1,108 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.Builder; -import lombok.Data; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * 参考 https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#接口说明 模板消息部分 - * - * @author Binary Wang - */ -@Data -@Builder -public class WxMaTemplateMessage implements Serializable { - private static final long serialVersionUID = 5063374783759519418L; - - /** - *
- * 参数:touser - * 是否必填: 是 - * 描述: 接收者(用户)的 openid - *- */ - private String toUser; - - /** - *
- * 参数:template_id - * 是否必填: 是 - * 描述: 所需下发的模板消息的id - *- */ - private String templateId; - - /** - *
- * 参数:page - * 是否必填: 否 - * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 - *- */ - private String page; - - /** - *
- * 参数:form_id - * 是否必填: 是 - * 描述: 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id - *- */ - private String formId; - - /** - *
- * 参数:data - * 是否必填: 是 - * 描述: 模板内容,不填则下发空模板 - *- */ - @Builder.Default - private final List data = new ArrayList<>(); - - /** - *
- * 参数:color - * 是否必填: 否 - * 描述: 模板内容字体的颜色,不填默认黑色 - *- */ - private String color; - - /** - *
- * 参数:emphasis_keyword - * 是否必填: 否 - * 描述: 模板需要放大的关键词,不填则默认无放大 - *- */ - private String emphasisKeyword; - - public String toJson() { - return WxMaGsonBuilder.create().toJson(this); - } - - @lombok.Data - public static class Data { - private String name; - private String value; - private String color; - - public Data(String name, String value) { - this.name = name; - this.value = value; - } - - public Data(String name, String value, String color) { - this.name = name; - this.value = value; - this.color = color; - } - - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 参考 https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#接口说明 模板消息部分 + * + * @author Binary Wang + */ +@Data +@Builder +public class WxMaTemplateMessage implements Serializable { + private static final long serialVersionUID = 5063374783759519418L; + + /** + *
+ * 参数:touser + * 是否必填: 是 + * 描述: 接收者(用户)的 openid + *+ */ + private String toUser; + + /** + *
+ * 参数:template_id + * 是否必填: 是 + * 描述: 所需下发的模板消息的id + *+ */ + private String templateId; + + /** + *
+ * 参数:page + * 是否必填: 否 + * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 + *+ */ + private String page; + + /** + *
+ * 参数:form_id + * 是否必填: 是 + * 描述: 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id + *+ */ + private String formId; + + /** + *
+ * 参数:data + * 是否必填: 是 + * 描述: 模板内容,不填则下发空模板 + *+ */ + @Builder.Default + private final List data = new ArrayList<>(); + + /** + *
+ * 参数:color + * 是否必填: 否 + * 描述: 模板内容字体的颜色,不填默认黑色 + *+ */ + private String color; + + /** + *
+ * 参数:emphasis_keyword + * 是否必填: 否 + * 描述: 模板需要放大的关键词,不填则默认无放大 + *+ */ + private String emphasisKeyword; + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + + @lombok.Data + public static class Data { + private String name; + private String value; + private String color; + + public Data(String name, String value) { + this.name = name; + this.value = value; + } + + public Data(String name, String value, String color) { + this.name = name; + this.value = value; + this.color = color; + } + + } + +} 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 a16fc30a1a..8b0ed8fe6a 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,35 +1,35 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author Binary Wang - */ -@Data -public class WxMaUserInfo implements Serializable { - private static final long serialVersionUID = 6719822331555402137L; - - private String openId; - private String nickName; - private String gender; - private String language; - private String city; - private String province; - private String country; - private String avatarUrl; - private String unionId; - private Watermark watermark; - - public static WxMaUserInfo fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaUserInfo.class); - } - - @Data - public static class Watermark { - private String timestamp; - private String appid; - } -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Binary Wang + */ +@Data +public class WxMaUserInfo implements Serializable { + private static final long serialVersionUID = 6719822331555402137L; + + private String openId; + private String nickName; + private String gender; + private String language; + private String city; + private String province; + private String country; + private String avatarUrl; + private String unionId; + private Watermark watermark; + + public static WxMaUserInfo fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaUserInfo.class); + } + + @Data + public static class Watermark { + private String timestamp; + private String appid; + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcode.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcode.java index 7d9c60e676..8e629096c6 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcode.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcode.java @@ -1,33 +1,33 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * - * @author Element - * @date 2017/7/27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class WxMaWxcode extends AbstractWxMaQrcodeWrapper implements Serializable { - private static final long serialVersionUID = 1287399621649210322L; - - private String path; - private int width = 430; - - @SerializedName("auto_color") - private boolean autoColor = true; - - @SerializedName("line_color") - private WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0"); - - public static WxMaWxcode fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaWxcode.class); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * + * @author Element + * @date 2017/7/27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxMaWxcode extends AbstractWxMaQrcodeWrapper implements Serializable { + private static final long serialVersionUID = 1287399621649210322L; + + private String path; + private int width = 430; + + @SerializedName("auto_color") + private boolean autoColor = true; + + @SerializedName("line_color") + private WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0"); + + public static WxMaWxcode fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaWxcode.class); + } + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java index 928e9b7d91..5f76273b54 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java @@ -1,34 +1,34 @@ -package cn.binarywang.wx.miniapp.bean; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * - * @author Element - * @date 2017/7/27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class WxMaWxcodeLimit extends AbstractWxMaQrcodeWrapper implements Serializable { - private static final long serialVersionUID = 4782193774524960401L; - private String scene; - private String page; - - private int width = 430; - - @SerializedName("auto_color") - private boolean autoColor = true; - - @SerializedName("line_color") - private WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0"); - - public static WxMaWxcodeLimit fromJson(String json) { - return WxMaGsonBuilder.create().fromJson(json, WxMaWxcodeLimit.class); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * + * @author Element + * @date 2017/7/27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxMaWxcodeLimit extends AbstractWxMaQrcodeWrapper implements Serializable { + private static final long serialVersionUID = 4782193774524960401L; + private String scene; + private String page; + + private int width = 430; + + @SerializedName("auto_color") + private boolean autoColor = true; + + @SerializedName("line_color") + private WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0"); + + public static WxMaWxcodeLimit fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaWxcodeLimit.class); + } + +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java index 39475453a0..d6aa31a71f 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java @@ -1,73 +1,73 @@ -package cn.binarywang.wx.miniapp.api.impl; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; -import cn.binarywang.wx.miniapp.test.ApiTestModule; -import cn.binarywang.wx.miniapp.test.TestConfig; -import com.google.common.collect.Lists; -import com.google.inject.Inject; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.exception.WxErrorException; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * 测试客服相关接口 - * - * @author Binary Wang - */ -@Test -@Guice(modules = ApiTestModule.class) -public class WxMaMsgServiceImplTest { - - @Inject - protected WxMaService wxService; - - public void testSendKefuMpNewsMessage() throws WxErrorException { - TestConfig configStorage = (TestConfig) this.wxService - .getWxMaConfig(); - WxMaKefuMessage message = new WxMaKefuMessage(); - message.setMsgType(WxConsts.KefuMsgType.MPNEWS); - message.setToUser(configStorage.getOpenid()); - - this.wxService.getMsgService().sendKefuMsg(message); - } - - public void testSendKefuMessage() throws WxErrorException { - TestConfig config = (TestConfig) this.wxService - .getWxMaConfig(); - WxMaKefuMessage message = new WxMaKefuMessage(); - message.setMsgType(WxConsts.KefuMsgType.TEXT); - message.setToUser(config.getOpenid()); - message.setContent( - "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World"); - - this.wxService.getMsgService().sendKefuMsg(message); - } - - @Test(invocationCount = 5, threadPoolSize = 3) - public void testSendTemplateMsg() throws WxErrorException { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); - - WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder() - .toUser(config.getOpenid()) - .formId("FORMID") - .page("index") - .data(Lists.newArrayList( - new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), - new WxMaTemplateMessage.Data("keyword2", dateFormat.format(new Date()), "#173177"), - new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), - new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) - .templateId(config.getTemplateId()) - .emphasisKeyword("keyword1.DATA") - .build(); - - this.wxService.getMsgService().sendTemplateMsg(templateMessage); - } - -} +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; +import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; +import cn.binarywang.wx.miniapp.test.ApiTestModule; +import cn.binarywang.wx.miniapp.test.TestConfig; +import com.google.common.collect.Lists; +import com.google.inject.Inject; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.exception.WxErrorException; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 测试客服相关接口 + * + * @author Binary Wang + */ +@Test +@Guice(modules = ApiTestModule.class) +public class WxMaMsgServiceImplTest { + + @Inject + protected WxMaService wxService; + + public void testSendKefuMpNewsMessage() throws WxErrorException { + TestConfig configStorage = (TestConfig) this.wxService + .getWxMaConfig(); + WxMaKefuMessage message = new WxMaKefuMessage(); + message.setMsgType(WxConsts.KefuMsgType.MPNEWS); + message.setToUser(configStorage.getOpenid()); + + this.wxService.getMsgService().sendKefuMsg(message); + } + + public void testSendKefuMessage() throws WxErrorException { + TestConfig config = (TestConfig) this.wxService + .getWxMaConfig(); + WxMaKefuMessage message = new WxMaKefuMessage(); + message.setMsgType(WxConsts.KefuMsgType.TEXT); + message.setToUser(config.getOpenid()); + message.setContent( + "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World"); + + this.wxService.getMsgService().sendKefuMsg(message); + } + + @Test(invocationCount = 5, threadPoolSize = 3) + public void testSendTemplateMsg() throws WxErrorException { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); + + WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder() + .toUser(config.getOpenid()) + .formId("FORMID") + .page("index") + .data(Lists.newArrayList( + new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), + new WxMaTemplateMessage.Data("keyword2", dateFormat.format(new Date()), "#173177"), + new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), + new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) + .templateId(config.getTemplateId()) + .emphasisKeyword("keyword1.DATA") + .build(); + + this.wxService.getMsgService().sendTemplateMsg(templateMessage); + } + +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java index e1db78f8de..d4464312eb 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java @@ -1,31 +1,31 @@ -package cn.binarywang.wx.miniapp.bean; - -import com.google.common.collect.Lists; -import org.testng.annotations.Test; - -import static org.testng.AssertJUnit.assertEquals; - -/** - * @author Binary Wang - */ -public class WxMaTemplateMessageTest { - @Test - public void testToJson() throws Exception { - WxMaTemplateMessage tm = WxMaTemplateMessage.builder() - .toUser("OPENID") - //.color("aaaaa") - .formId("FORMID") - .page("index") - .data(Lists.newArrayList( - new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), - new WxMaTemplateMessage.Data("keyword2", "2015年01月05日12:30", "#173177"), - new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), - new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) - .templateId("TEMPLATE_ID") - .emphasisKeyword("keyword1.DATA") - .build(); - - assertEquals(tm.toJson(), "{\"touser\":\"OPENID\",\"template_id\":\"TEMPLATE_ID\",\"page\":\"index\",\"form_id\":\"FORMID\",\"emphasis_keyword\":\"keyword1.DATA\",\"data\":{\"keyword1\":{\"value\":\"339208499\",\"color\":\"#173177\"},\"keyword2\":{\"value\":\"2015年01月05日12:30\",\"color\":\"#173177\"},\"keyword3\":{\"value\":\"粤海喜来登酒店\",\"color\":\"#173177\"},\"keyword4\":{\"value\":\"广州市天河区天河路208号\",\"color\":\"#173177\"}}}"); - } - -} +package cn.binarywang.wx.miniapp.bean; + +import com.google.common.collect.Lists; +import org.testng.annotations.Test; + +import static org.testng.AssertJUnit.assertEquals; + +/** + * @author Binary Wang + */ +public class WxMaTemplateMessageTest { + @Test + public void testToJson() throws Exception { + WxMaTemplateMessage tm = WxMaTemplateMessage.builder() + .toUser("OPENID") + //.color("aaaaa") + .formId("FORMID") + .page("index") + .data(Lists.newArrayList( + new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), + new WxMaTemplateMessage.Data("keyword2", "2015年01月05日12:30", "#173177"), + new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), + new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) + .templateId("TEMPLATE_ID") + .emphasisKeyword("keyword1.DATA") + .build(); + + assertEquals(tm.toJson(), "{\"touser\":\"OPENID\",\"template_id\":\"TEMPLATE_ID\",\"page\":\"index\",\"form_id\":\"FORMID\",\"emphasis_keyword\":\"keyword1.DATA\",\"data\":{\"keyword1\":{\"value\":\"339208499\",\"color\":\"#173177\"},\"keyword2\":{\"value\":\"2015年01月05日12:30\",\"color\":\"#173177\"},\"keyword3\":{\"value\":\"粤海喜来登酒店\",\"color\":\"#173177\"},\"keyword4\":{\"value\":\"广州市天河区天河路208号\",\"color\":\"#173177\"}}}"); + } + +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java index bc0f6bb000..8d14b261ff 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java @@ -1,148 +1,148 @@ -package cn.binarywang.wx.miniapp.demo; - -import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; -import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; -import cn.binarywang.wx.miniapp.bean.WxMaMessage; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; -import cn.binarywang.wx.miniapp.config.WxMaConfig; -import cn.binarywang.wx.miniapp.constant.WxMaConstants; -import cn.binarywang.wx.miniapp.message.WxMaMessageHandler; -import cn.binarywang.wx.miniapp.message.WxMaMessageRouter; -import cn.binarywang.wx.miniapp.test.TestConfig; -import com.google.common.collect.Lists; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.session.WxSessionManager; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletHandler; -import org.eclipse.jetty.servlet.ServletHolder; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.concurrent.locks.ReentrantLock; - -/** - * @author Binary Wang - */ -public class WxMaDemoServer { - - private static final WxMaMessageHandler logHandler = new WxMaMessageHandler() { - @Override - public void handle(WxMaMessage wxMessage, Map
- * 群发消息服务类 - * Created by Binary Wang on 2017-8-16. - *- * - * @author Binary Wang - */ -public interface WxMpMassMessageService { - /** - * 上传群发用的图文消息 - */ - String MEDIA_UPLOAD_NEWS_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadnews"; - /** - * 上传群发用的视频 - */ - String MEDIA_UPLOAD_VIDEO_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo"; - /** - * 分组群发消息 - */ - String MESSAGE_MASS_SENDALL_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall"; - /** - * 按openId列表群发消息 - */ - String MESSAGE_MASS_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/send"; - /** - * 群发消息预览接口 - */ - String MESSAGE_MASS_PREVIEW_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; - /** - * 删除群发接口 - */ - String MESSAGE_MASS_DELETE_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/delete"; - - /** - *
- * 上传群发用的图文消息,上传后才能群发图文消息 - * - * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN - *- * - * @see #massGroupMessageSend(WxMpMassTagMessage) - * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) - */ - WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException; - - /** - *
- * 上传群发用的视频,上传后才能群发视频消息 - * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN - *- * - * @see #massGroupMessageSend(WxMpMassTagMessage) - * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) - */ - WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException; - - /** - *
- * 分组群发消息
- * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMpMassNews)} 获得media_id,然后再发送
- * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMpMassVideo)} 获得media_id,然后再发送
- * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
- *
- */
- WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException;
-
- /**
- *
- * 按openId列表群发消息
- * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMpMassNews)} 获得media_id,然后再发送
- * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMpMassVideo)} 获得media_id,然后再发送
- * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
- *
- */
- WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException;
-
- /**
- * - * 群发消息预览接口 - * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版。为了满足第三方平台开发者的需求,在保留对openID预览能力的同时,增加了对指定微信号发送预览的能力,但该能力每日调用次数有限制(100次),请勿滥用。 - * 接口调用请求说明 - * http请求方式: POST - * https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN - * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN - *- * - * @return wxMpMassSendResult - */ - WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws WxErrorException; - - /** - *
- * 删除群发 - * 群发之后,随时可以通过该接口删除群发。 - * 请注意: - * 1、只有已经发送成功的消息才能删除 - * 2、删除消息是将消息的图文详情页失效,已经收到的用户,还是能在其本地看到消息卡片。 - * 3、删除群发消息只能删除图文消息和视频消息,其他类型的消息一经发送,无法删除。 - * 4、如果多次群发发送的是一个图文消息,那么删除其中一次群发,就会删除掉这个图文消息也,导致所有群发都失效 - * 接口调用请求说明: - * http请求方式: POST - * https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=ACCESS_TOKEN - * 详情请见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21 - *- * - * @param msgId 发送出去的消息ID - * @param articleIndex 要删除的文章在图文消息中的位置,第一篇编号为1,该字段不填或填0会删除全部文章 - */ - void delete(Integer msgId, Integer articleIndex) throws WxErrorException; - -} +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.*; +import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; + +/** + *
+ * 群发消息服务类 + * Created by Binary Wang on 2017-8-16. + *+ * + * @author Binary Wang + */ +public interface WxMpMassMessageService { + /** + * 上传群发用的图文消息 + */ + String MEDIA_UPLOAD_NEWS_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadnews"; + /** + * 上传群发用的视频 + */ + String MEDIA_UPLOAD_VIDEO_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo"; + /** + * 分组群发消息 + */ + String MESSAGE_MASS_SENDALL_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall"; + /** + * 按openId列表群发消息 + */ + String MESSAGE_MASS_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/send"; + /** + * 群发消息预览接口 + */ + String MESSAGE_MASS_PREVIEW_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; + /** + * 删除群发接口 + */ + String MESSAGE_MASS_DELETE_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/delete"; + + /** + *
+ * 上传群发用的图文消息,上传后才能群发图文消息 + * + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN + *+ * + * @see #massGroupMessageSend(WxMpMassTagMessage) + * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) + */ + WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException; + + /** + *
+ * 上传群发用的视频,上传后才能群发视频消息 + * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN + *+ * + * @see #massGroupMessageSend(WxMpMassTagMessage) + * @see #massOpenIdsMessageSend(WxMpMassOpenIdsMessage) + */ + WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException; + + /** + *
+ * 分组群发消息
+ * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMpMassNews)} 获得media_id,然后再发送
+ * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMpMassVideo)} 获得media_id,然后再发送
+ * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
+ *
+ */
+ WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException;
+
+ /**
+ *
+ * 按openId列表群发消息
+ * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMpMassNews)} 获得media_id,然后再发送
+ * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMpMassVideo)} 获得media_id,然后再发送
+ * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
+ *
+ */
+ WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException;
+
+ /**
+ * + * 群发消息预览接口 + * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版。为了满足第三方平台开发者的需求,在保留对openID预览能力的同时,增加了对指定微信号发送预览的能力,但该能力每日调用次数有限制(100次),请勿滥用。 + * 接口调用请求说明 + * http请求方式: POST + * https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN + * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN + *+ * + * @return wxMpMassSendResult + */ + WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws WxErrorException; + + /** + *
+ * 删除群发 + * 群发之后,随时可以通过该接口删除群发。 + * 请注意: + * 1、只有已经发送成功的消息才能删除 + * 2、删除消息是将消息的图文详情页失效,已经收到的用户,还是能在其本地看到消息卡片。 + * 3、删除群发消息只能删除图文消息和视频消息,其他类型的消息一经发送,无法删除。 + * 4、如果多次群发发送的是一个图文消息,那么删除其中一次群发,就会删除掉这个图文消息也,导致所有群发都失效 + * 接口调用请求说明: + * http请求方式: POST + * https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=ACCESS_TOKEN + * 详情请见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21 + *+ * + * @param msgId 发送出去的消息ID + * @param articleIndex 要删除的文章在图文消息中的位置,第一篇编号为1,该字段不填或填0会删除全部文章 + */ + void delete(Integer msgId, Integer articleIndex) throws WxErrorException; + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpShakeService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpShakeService.java index 3d423b0feb..697bfe899d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpShakeService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpShakeService.java @@ -1,61 +1,61 @@ -package me.chanjar.weixin.mp.api; - -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.WxMpShakeInfoResult; -import me.chanjar.weixin.mp.bean.WxMpShakeQuery; -import me.chanjar.weixin.mp.bean.shake.*; - -/** - * 摇一摇周边的相关接口 - * - * @author rememberber - */ -public interface WxMpShakeService { - - /** - *
- * 获取设备及用户信息- * - * @param wxMpShakeQuery 查询参数 - */ - WxMpShakeInfoResult getShakeInfo(WxMpShakeQuery wxMpShakeQuery) throws WxErrorException; - - /** - *
- * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。 - * 详情请见: https://mp.weixin.qq.com/wiki?action=doc&id=mp1443447963 - * http请求方式: POST(请使用https协议) - * 接口地址:https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=ACCESS_TOKE - *
- * 页面管理- * @param shakeAroundPageAddQuery - * @return - * @throws WxErrorException - */ - WxMpShakeAroundPageAddResult pageAdd(WxMpShakeAroundPageAddQuery shakeAroundPageAddQuery) throws WxErrorException; - - /** - *
- * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1459246752 - *
- * 配置设备与页面的关联关系- * @param shakeAroundDeviceBindPageQuery - * @return - * @throws WxErrorException - */ - WxError deviceBindPageQuery(WxMpShakeAroundDeviceBindPageQuery shakeAroundDeviceBindPageQuery) throws WxErrorException; - - /** - *
- * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1459301931 - *
- * 查询设备与页面的关联关系- * @param shakeAroundRelationSearchQuery - * @return - * @throws WxErrorException - */ - WxMpShakeAroundRelationSearchResult relationSearch(WxMpShakeAroundRelationSearchQuery shakeAroundRelationSearchQuery) throws WxErrorException; -} +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.WxMpShakeInfoResult; +import me.chanjar.weixin.mp.bean.WxMpShakeQuery; +import me.chanjar.weixin.mp.bean.shake.*; + +/** + * 摇一摇周边的相关接口 + * + * @author rememberber + */ +public interface WxMpShakeService { + + /** + *
- * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443447914 - *
+ * 获取设备及用户信息+ * + * @param wxMpShakeQuery 查询参数 + */ + WxMpShakeInfoResult getShakeInfo(WxMpShakeQuery wxMpShakeQuery) throws WxErrorException; + + /** + *
+ * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。 + * 详情请见: https://mp.weixin.qq.com/wiki?action=doc&id=mp1443447963 + * http请求方式: POST(请使用https协议) + * 接口地址:https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=ACCESS_TOKE + *
+ * 页面管理+ * @param shakeAroundPageAddQuery + * @return + * @throws WxErrorException + */ + WxMpShakeAroundPageAddResult pageAdd(WxMpShakeAroundPageAddQuery shakeAroundPageAddQuery) throws WxErrorException; + + /** + *
+ * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1459246752 + *
+ * 配置设备与页面的关联关系+ * @param shakeAroundDeviceBindPageQuery + * @return + * @throws WxErrorException + */ + WxError deviceBindPageQuery(WxMpShakeAroundDeviceBindPageQuery shakeAroundDeviceBindPageQuery) throws WxErrorException; + + /** + *
+ * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1459301931 + *
+ * 查询设备与页面的关联关系+ * @param shakeAroundRelationSearchQuery + * @return + * @throws WxErrorException + */ + WxMpShakeAroundRelationSearchResult relationSearch(WxMpShakeAroundRelationSearchQuery shakeAroundRelationSearchQuery) throws WxErrorException; +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java index 4fe596442c..49ed7589f3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java @@ -1,239 +1,239 @@ -package me.chanjar.weixin.mp.api.impl; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonPrimitive; -import com.google.gson.reflect.TypeToken; -import me.chanjar.weixin.common.bean.WxCardApiSignature; -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.util.RandomUtils; -import me.chanjar.weixin.common.util.crypto.SHA1; -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; -import me.chanjar.weixin.mp.api.WxMpCardService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.result.WxMpCardResult; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.concurrent.locks.Lock; - -/** - * Created by Binary Wang on 2016/7/27. - */ -public class WxMpCardServiceImpl implements WxMpCardService { - - private final Logger log = LoggerFactory.getLogger(WxMpCardServiceImpl.class); - - private WxMpService wxMpService; - - public WxMpCardServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public WxMpService getWxMpService() { - return this.wxMpService; - } - - /** - * 获得卡券api_ticket,不强制刷新卡券api_ticket - * - * @return 卡券api_ticket - * @see #getCardApiTicket(boolean) - */ - @Override - public String getCardApiTicket() throws WxErrorException { - return getCardApiTicket(false); - } - - /** - *
+ * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443447914 + *
- * 获得卡券api_ticket - * 获得时会检查卡券apiToken是否过期,如果过期了,那么就刷新一下,否则就什么都不干 - * - * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD - * .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94 - * .9F.E6.88.90.E7.AE.97.E6.B3.95 - *- * - * @param forceRefresh 强制刷新 - * @return 卡券api_ticket - */ - @Override - public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { - Lock lock = getWxMpService().getWxMpConfigStorage().getCardApiTicketLock(); - try { - lock.lock(); - - if (forceRefresh) { - this.getWxMpService().getWxMpConfigStorage().expireCardApiTicket(); - } - - if (this.getWxMpService().getWxMpConfigStorage().isCardApiTicketExpired()) { - String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor.create(this.getWxMpService().getRequestHttp()), CARD_GET_TICKET, null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); - String cardApiTicket = tmpJsonObject.get("ticket").getAsString(); - int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); - this.getWxMpService().getWxMpConfigStorage().updateCardApiTicket(cardApiTicket, expiresInSeconds); - } - } finally { - lock.unlock(); - } - return this.getWxMpService().getWxMpConfigStorage().getCardApiTicket(); - } - - /** - *
- * 创建调用卡券api时所需要的签名 - * - * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD - * .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94 - * .9F.E6.88.90.E7.AE.97.E6.B3.95 - *- * - * @param optionalSignParam 参与签名的参数数组。 - * 可以为下列字段:app_id, card_id, card_type, code, openid, location_id - * 注意:当做wx.chooseCard调用时,必须传入app_id参与签名,否则会造成签名失败导致拉取卡券列表为空 - * @return 卡券Api签名对象 - */ - @Override - public WxCardApiSignature createCardApiSignature(String... optionalSignParam) throws - WxErrorException { - long timestamp = System.currentTimeMillis() / 1000; - String nonceStr = RandomUtils.getRandomStr(); - String cardApiTicket = getCardApiTicket(false); - - String[] signParam = Arrays.copyOf(optionalSignParam, optionalSignParam.length + 3); - signParam[optionalSignParam.length] = String.valueOf(timestamp); - signParam[optionalSignParam.length + 1] = nonceStr; - signParam[optionalSignParam.length + 2] = cardApiTicket; - String signature = SHA1.gen(signParam); - WxCardApiSignature cardApiSignature = new WxCardApiSignature(); - cardApiSignature.setTimestamp(timestamp); - cardApiSignature.setNonceStr(nonceStr); - cardApiSignature.setSignature(signature); - return cardApiSignature; - } - - /** - * 卡券Code解码 - * - * @param encryptCode 加密Code,通过JSSDK的chooseCard接口获得 - * @return 解密后的Code - */ - @Override - public String decryptCardCode(String encryptCode) throws WxErrorException { - JsonObject param = new JsonObject(); - param.addProperty("encrypt_code", encryptCode); - String responseContent = this.wxMpService.post(CARD_CODE_DECRYPT, param.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); - JsonPrimitive jsonPrimitive = tmpJsonObject.getAsJsonPrimitive("code"); - return jsonPrimitive.getAsString(); - } - - /** - * 卡券Code查询 - * - * @param cardId 卡券ID代表一类卡券 - * @param code 单张卡券的唯一标准 - * @param checkConsume 是否校验code核销状态,填入true和false时的code异常状态返回数据不同 - * @return WxMpCardResult对象 - */ - @Override - public WxMpCardResult queryCardCode(String cardId, String code, boolean checkConsume) throws WxErrorException { - JsonObject param = new JsonObject(); - param.addProperty("card_id", cardId); - param.addProperty("code", code); - param.addProperty("check_consume", checkConsume); - String responseContent = this.wxMpService.post(CARD_CODE_GET, param.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement, - new TypeToken
+ * 获得卡券api_ticket + * 获得时会检查卡券apiToken是否过期,如果过期了,那么就刷新一下,否则就什么都不干 + * + * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD + * .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94 + * .9F.E6.88.90.E7.AE.97.E6.B3.95 + *+ * + * @param forceRefresh 强制刷新 + * @return 卡券api_ticket + */ + @Override + public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { + Lock lock = getWxMpService().getWxMpConfigStorage().getCardApiTicketLock(); + try { + lock.lock(); + + if (forceRefresh) { + this.getWxMpService().getWxMpConfigStorage().expireCardApiTicket(); + } + + if (this.getWxMpService().getWxMpConfigStorage().isCardApiTicketExpired()) { + String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor.create(this.getWxMpService().getRequestHttp()), CARD_GET_TICKET, null); + JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); + String cardApiTicket = tmpJsonObject.get("ticket").getAsString(); + int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); + this.getWxMpService().getWxMpConfigStorage().updateCardApiTicket(cardApiTicket, expiresInSeconds); + } + } finally { + lock.unlock(); + } + return this.getWxMpService().getWxMpConfigStorage().getCardApiTicket(); + } + + /** + *
+ * 创建调用卡券api时所需要的签名 + * + * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD + * .954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94 + * .9F.E6.88.90.E7.AE.97.E6.B3.95 + *+ * + * @param optionalSignParam 参与签名的参数数组。 + * 可以为下列字段:app_id, card_id, card_type, code, openid, location_id + * 注意:当做wx.chooseCard调用时,必须传入app_id参与签名,否则会造成签名失败导致拉取卡券列表为空 + * @return 卡券Api签名对象 + */ + @Override + public WxCardApiSignature createCardApiSignature(String... optionalSignParam) throws + WxErrorException { + long timestamp = System.currentTimeMillis() / 1000; + String nonceStr = RandomUtils.getRandomStr(); + String cardApiTicket = getCardApiTicket(false); + + String[] signParam = Arrays.copyOf(optionalSignParam, optionalSignParam.length + 3); + signParam[optionalSignParam.length] = String.valueOf(timestamp); + signParam[optionalSignParam.length + 1] = nonceStr; + signParam[optionalSignParam.length + 2] = cardApiTicket; + String signature = SHA1.gen(signParam); + WxCardApiSignature cardApiSignature = new WxCardApiSignature(); + cardApiSignature.setTimestamp(timestamp); + cardApiSignature.setNonceStr(nonceStr); + cardApiSignature.setSignature(signature); + return cardApiSignature; + } + + /** + * 卡券Code解码 + * + * @param encryptCode 加密Code,通过JSSDK的chooseCard接口获得 + * @return 解密后的Code + */ + @Override + public String decryptCardCode(String encryptCode) throws WxErrorException { + JsonObject param = new JsonObject(); + param.addProperty("encrypt_code", encryptCode); + String responseContent = this.wxMpService.post(CARD_CODE_DECRYPT, param.toString()); + JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); + JsonPrimitive jsonPrimitive = tmpJsonObject.getAsJsonPrimitive("code"); + return jsonPrimitive.getAsString(); + } + + /** + * 卡券Code查询 + * + * @param cardId 卡券ID代表一类卡券 + * @param code 单张卡券的唯一标准 + * @param checkConsume 是否校验code核销状态,填入true和false时的code异常状态返回数据不同 + * @return WxMpCardResult对象 + */ + @Override + public WxMpCardResult queryCardCode(String cardId, String code, boolean checkConsume) throws WxErrorException { + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + param.addProperty("code", code); + param.addProperty("check_consume", checkConsume); + String responseContent = this.wxMpService.post(CARD_CODE_GET, param.toString()); + JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement, + new TypeToken
- * 群发消息服务类 - * Created by Binary Wang on 2017-8-16. - *- * - * @author Binary Wang - */ -public class WxMpMassMessageServiceImpl implements WxMpMassMessageService { - protected final Logger log = LoggerFactory.getLogger(this.getClass()); - private WxMpService wxMpService; - - public WxMpMassMessageServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException { - String responseContent = this.wxMpService.post(MEDIA_UPLOAD_NEWS_URL, news.toJson()); - return WxMpMassUploadResult.fromJson(responseContent); - } - - @Override - public WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException { - String responseContent = this.wxMpService.post(MEDIA_UPLOAD_VIDEO_URL, video.toJson()); - return WxMpMassUploadResult.fromJson(responseContent); - } - - @Override - public WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException { - String responseContent = this.wxMpService.post(WxMpMassMessageService.MESSAGE_MASS_SENDALL_URL, message.toJson()); - return WxMpMassSendResult.fromJson(responseContent); - } - - @Override - public WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException { - String responseContent = this.wxMpService.post(MESSAGE_MASS_SEND_URL, message.toJson()); - return WxMpMassSendResult.fromJson(responseContent); - } - - @Override - public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws WxErrorException { - String responseContent = this.wxMpService.post(MESSAGE_MASS_PREVIEW_URL, wxMpMassPreviewMessage.toJson()); - return WxMpMassSendResult.fromJson(responseContent); - } - - @Override - public void delete(Integer msgId, Integer articleIndex) throws WxErrorException { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("msg_id", msgId); - jsonObject.addProperty("article_idx", articleIndex); - this.wxMpService.post(MESSAGE_MASS_DELETE_URL, jsonObject.toString()); - } - -} +package me.chanjar.weixin.mp.api.impl; + +import com.google.gson.JsonObject; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpMassMessageService; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.*; +import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + *
+ * 群发消息服务类 + * Created by Binary Wang on 2017-8-16. + *+ * + * @author Binary Wang + */ +public class WxMpMassMessageServiceImpl implements WxMpMassMessageService { + protected final Logger log = LoggerFactory.getLogger(this.getClass()); + private WxMpService wxMpService; + + public WxMpMassMessageServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + @Override + public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException { + String responseContent = this.wxMpService.post(MEDIA_UPLOAD_NEWS_URL, news.toJson()); + return WxMpMassUploadResult.fromJson(responseContent); + } + + @Override + public WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException { + String responseContent = this.wxMpService.post(MEDIA_UPLOAD_VIDEO_URL, video.toJson()); + return WxMpMassUploadResult.fromJson(responseContent); + } + + @Override + public WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException { + String responseContent = this.wxMpService.post(WxMpMassMessageService.MESSAGE_MASS_SENDALL_URL, message.toJson()); + return WxMpMassSendResult.fromJson(responseContent); + } + + @Override + public WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException { + String responseContent = this.wxMpService.post(MESSAGE_MASS_SEND_URL, message.toJson()); + return WxMpMassSendResult.fromJson(responseContent); + } + + @Override + public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws WxErrorException { + String responseContent = this.wxMpService.post(MESSAGE_MASS_PREVIEW_URL, wxMpMassPreviewMessage.toJson()); + return WxMpMassSendResult.fromJson(responseContent); + } + + @Override + public void delete(Integer msgId, Integer articleIndex) throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("msg_id", msgId); + jsonObject.addProperty("article_idx", articleIndex); + this.wxMpService.post(MESSAGE_MASS_DELETE_URL, jsonObject.toString()); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java index e5283a7b28..520f69ea0d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java @@ -1,151 +1,151 @@ -package me.chanjar.weixin.mp.api.impl; - -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.util.fs.FileUtils; -import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; -import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; -import me.chanjar.weixin.common.util.json.WxGsonBuilder; -import me.chanjar.weixin.mp.api.WxMpMaterialService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.material.*; -import me.chanjar.weixin.mp.util.http.*; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -/** - * Created by Binary Wang on 2016/7/21. - */ -public class WxMpMaterialServiceImpl implements WxMpMaterialService { - - private WxMpService wxMpService; - - public WxMpMaterialServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) throws WxErrorException { - try { - return this.mediaUpload(mediaType, FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), fileType)); - } catch (IOException e) { - throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg(e.getMessage()).build(), e); - } - } - - @Override - public WxMediaUploadResult mediaUpload(String mediaType, File file) throws WxErrorException { - String url = String.format(MEDIA_UPLOAD_URL, mediaType); - return this.wxMpService.execute(MediaUploadRequestExecutor.create(this.wxMpService.getRequestHttp()), url, file); - } - - @Override - public File mediaDownload(String mediaId) throws WxErrorException { - return this.wxMpService.execute( - BaseMediaDownloadRequestExecutor.create(this.wxMpService.getRequestHttp(), this.wxMpService.getWxMpConfigStorage().getTmpDirFile()), - MEDIA_GET_URL, - "media_id=" + mediaId); - } - - @Override - public WxMediaImgUploadResult mediaImgUpload(File file) throws WxErrorException { - return this.wxMpService.execute(MediaImgUploadRequestExecutor.create(this.wxMpService.getRequestHttp()), IMG_UPLOAD_URL, file); - } - - @Override - public WxMpMaterialUploadResult materialFileUpload(String mediaType, WxMpMaterial material) throws WxErrorException { - String url = String.format(MATERIAL_ADD_URL, mediaType); - return this.wxMpService.execute(MaterialUploadRequestExecutor.create(this.wxMpService.getRequestHttp()), url, material); - } - - @Override - public WxMpMaterialUploadResult materialNewsUpload(WxMpMaterialNews news) throws WxErrorException { - if (news == null || news.isEmpty()) { - throw new IllegalArgumentException("news is empty!"); - } - String responseContent = this.wxMpService.post(NEWS_ADD_URL, news.toJson()); - return WxMpMaterialUploadResult.fromJson(responseContent); - } - - @Override - public InputStream materialImageOrVoiceDownload(String mediaId) throws WxErrorException { - return this.wxMpService.execute(MaterialVoiceAndImageDownloadRequestExecutor - .create(this.wxMpService.getRequestHttp(), this.wxMpService.getWxMpConfigStorage().getTmpDirFile()), MATERIAL_GET_URL, mediaId); - } - - @Override - public WxMpMaterialVideoInfoResult materialVideoInfo(String mediaId) throws WxErrorException { - return this.wxMpService.execute(MaterialVideoInfoRequestExecutor.create(this.wxMpService.getRequestHttp()), MATERIAL_GET_URL, mediaId); - } - - @Override - public WxMpMaterialNews materialNewsInfo(String mediaId) throws WxErrorException { - return this.wxMpService.execute(MaterialNewsInfoRequestExecutor.create(this.wxMpService.getRequestHttp()), MATERIAL_GET_URL, mediaId); - } - - @Override - public boolean materialNewsUpdate(WxMpMaterialArticleUpdate wxMpMaterialArticleUpdate) throws WxErrorException { - String responseText = this.wxMpService.post(NEWS_UPDATE_URL, wxMpMaterialArticleUpdate.toJson()); - WxError wxError = WxError.fromJson(responseText); - if (wxError.getErrorCode() == 0) { - return true; - } else { - throw new WxErrorException(wxError); - } - } - - @Override - public boolean materialDelete(String mediaId) throws WxErrorException { - return this.wxMpService.execute(MaterialDeleteRequestExecutor.create(this.wxMpService.getRequestHttp()), MATERIAL_DEL_URL, mediaId); - } - - @Override - public WxMpMaterialCountResult materialCount() throws WxErrorException { - String responseText = this.wxMpService.get(MATERIAL_GET_COUNT_URL, null); - WxError wxError = WxError.fromJson(responseText); - if (wxError.getErrorCode() == 0) { - return WxMpGsonBuilder.create().fromJson(responseText, WxMpMaterialCountResult.class); - } else { - throw new WxErrorException(wxError); - } - } - - @Override - public WxMpMaterialNewsBatchGetResult materialNewsBatchGet(int offset, int count) throws WxErrorException { - Map
- * 获取设备及用户信息- * - * @param wxMpShakeQuery 查询参数 - */ - @Override - public WxMpShakeInfoResult getShakeInfo(WxMpShakeQuery wxMpShakeQuery) throws WxErrorException { - String url = "https://api.weixin.qq.com/shakearound/user/getshakeinfo"; - String postData = wxMpShakeQuery.toJsonString(); - String responseContent = this.wxMpService.post(url, postData); - return WxMpShakeInfoResult.fromJson(responseContent); - } - - @Override - public WxMpShakeAroundPageAddResult pageAdd(WxMpShakeAroundPageAddQuery shakeAroundPageAddQuery) throws WxErrorException { - String url = "https://api.weixin.qq.com/shakearound/page/add"; - String postData = shakeAroundPageAddQuery.toJsonString(); - String responseContent = this.wxMpService.post(url, postData); - return WxMpShakeAroundPageAddResult.fromJson(responseContent); - } - - @Override - public WxError deviceBindPageQuery(WxMpShakeAroundDeviceBindPageQuery shakeAroundDeviceBindPageQuery) throws WxErrorException { - String url = "https://api.weixin.qq.com/shakearound/device/bindpage"; - String postData = shakeAroundDeviceBindPageQuery.toJsonString(); - String responseContent = this.wxMpService.post(url, postData); - return WxError.fromJson(responseContent); - } - - @Override - public WxMpShakeAroundRelationSearchResult relationSearch(WxMpShakeAroundRelationSearchQuery shakeAroundRelationSearchQuery) throws WxErrorException { - String url = "https://api.weixin.qq.com/shakearound/relation/search"; - String postData = shakeAroundRelationSearchQuery.toJsonString(); - String responseContent = this.wxMpService.post(url, postData); - return WxMpShakeAroundRelationSearchResult.fromJson(responseContent); - } -} +package me.chanjar.weixin.mp.api.impl; + +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpShakeService; +import me.chanjar.weixin.mp.bean.WxMpShakeInfoResult; +import me.chanjar.weixin.mp.bean.WxMpShakeQuery; +import me.chanjar.weixin.mp.bean.shake.*; + +/** + * Created by rememberber on 2017/6/5. + * + * @author rememberber + */ +public class WxMpShakeServiceImpl implements WxMpShakeService { + + private WxMpService wxMpService; + + public WxMpShakeServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + /** + *
- * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。 - * 详情请见: https://mp.weixin.qq.com/wiki?action=doc&id=mp1443447963 - * http请求方式: POST(请使用https协议) - * 接口地址:https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=ACCESS_TOKE - *
+ * 获取设备及用户信息+ * + * @param wxMpShakeQuery 查询参数 + */ + @Override + public WxMpShakeInfoResult getShakeInfo(WxMpShakeQuery wxMpShakeQuery) throws WxErrorException { + String url = "https://api.weixin.qq.com/shakearound/user/getshakeinfo"; + String postData = wxMpShakeQuery.toJsonString(); + String responseContent = this.wxMpService.post(url, postData); + return WxMpShakeInfoResult.fromJson(responseContent); + } + + @Override + public WxMpShakeAroundPageAddResult pageAdd(WxMpShakeAroundPageAddQuery shakeAroundPageAddQuery) throws WxErrorException { + String url = "https://api.weixin.qq.com/shakearound/page/add"; + String postData = shakeAroundPageAddQuery.toJsonString(); + String responseContent = this.wxMpService.post(url, postData); + return WxMpShakeAroundPageAddResult.fromJson(responseContent); + } + + @Override + public WxError deviceBindPageQuery(WxMpShakeAroundDeviceBindPageQuery shakeAroundDeviceBindPageQuery) throws WxErrorException { + String url = "https://api.weixin.qq.com/shakearound/device/bindpage"; + String postData = shakeAroundDeviceBindPageQuery.toJsonString(); + String responseContent = this.wxMpService.post(url, postData); + return WxError.fromJson(responseContent); + } + + @Override + public WxMpShakeAroundRelationSearchResult relationSearch(WxMpShakeAroundRelationSearchQuery shakeAroundRelationSearchQuery) throws WxErrorException { + String url = "https://api.weixin.qq.com/shakearound/relation/search"; + String postData = shakeAroundRelationSearchQuery.toJsonString(); + String responseContent = this.wxMpService.post(url, postData); + return WxMpShakeAroundRelationSearchResult.fromJson(responseContent); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java index 7c724537fb..3901c61fbc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java @@ -1,123 +1,123 @@ -package me.chanjar.weixin.mp.bean.datacube; - -import com.google.gson.annotations.SerializedName; -import com.google.gson.reflect.TypeToken; -import lombok.Data; -import lombok.EqualsAndHashCode; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - -import java.util.List; - -/** - * 图文分析数据接口返回结果对象 - *
+ * 获取设备信息,包括UUID、major、minor,以及距离、openID等信息。 + * 详情请见: https://mp.weixin.qq.com/wiki?action=doc&id=mp1443447963 + * http请求方式: POST(请使用https协议) + * 接口地址:https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=ACCESS_TOKE + *
- * Created by Binary Wang on 2016/8/24.
- *
- * @author Binary Wang
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
- private static final long serialVersionUID = -9222452497954511765L;
-
- /**
- * ref_hour
- * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
- */
- @SerializedName("ref_hour")
- private Integer refHour;
-
- /**
- * msgid
- * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)
- * 和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,
- * 假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
- */
- @SerializedName("msgid")
- private String msgId;
-
- /**
- * title
- * 图文消息的标题
- */
- @SerializedName("title")
- private String title;
-
- /**
- * int_page_read_user
- * 图文页(点击群发图文卡片进入的页面)的阅读人数
- */
- @SerializedName("int_page_read_user")
- private Integer intPageReadUser;
-
- /**
- * int_page_read_count
- * 图文页的阅读次数
- */
- @SerializedName("int_page_read_count")
- private Integer intPageReadCount;
-
- /**
- * ori_page_read_user
- * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
- */
- @SerializedName("ori_page_read_user")
- private Integer oriPageReadUser;
-
- /**
- * ori_page_read_count
- * 原文页的阅读次数
- */
- @SerializedName("ori_page_read_count")
- private Integer oriPageReadCount;
-
- /**
- * share_scene
- * 分享的场景 1代表好友转发 2代表朋友圈 3代表腾讯微博 255代表其他
- */
- @SerializedName("share_scene")
- private Integer shareScene;
-
- /**
- * share_user
- * 分享的人数
- */
- @SerializedName("share_user")
- private Integer shareUser;
-
- /**
- * share_count
- * 分享的次数
- */
- @SerializedName("share_count")
- private Integer shareCount;
-
- /**
- * add_to_fav_user
- * 收藏的人数
- */
- @SerializedName("add_to_fav_user")
- private Integer addToFavUser;
-
- /**
- * add_to_fav_count
- * 收藏的次数
- */
- @SerializedName("add_to_fav_count")
- private Integer addToFavCount;
-
- /**
- * user_source
- * 在获取图文阅读分时数据时才有该字段,代表用户从哪里进入来阅读该图文。0:会话;1.好友;2.朋友圈;3.腾讯微博;4.历史消息页;5.其他
- */
- @SerializedName("user_source")
- private Integer userSource;
-
- public static List
+ * Created by Binary Wang on 2016/8/24.
+ *
+ * @author Binary Wang
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
+ private static final long serialVersionUID = -9222452497954511765L;
+
+ /**
+ * ref_hour
+ * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
+ */
+ @SerializedName("ref_hour")
+ private Integer refHour;
+
+ /**
+ * msgid
+ * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)
+ * 和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,
+ * 假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
+ */
+ @SerializedName("msgid")
+ private String msgId;
+
+ /**
+ * title
+ * 图文消息的标题
+ */
+ @SerializedName("title")
+ private String title;
+
+ /**
+ * int_page_read_user
+ * 图文页(点击群发图文卡片进入的页面)的阅读人数
+ */
+ @SerializedName("int_page_read_user")
+ private Integer intPageReadUser;
+
+ /**
+ * int_page_read_count
+ * 图文页的阅读次数
+ */
+ @SerializedName("int_page_read_count")
+ private Integer intPageReadCount;
+
+ /**
+ * ori_page_read_user
+ * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
+ */
+ @SerializedName("ori_page_read_user")
+ private Integer oriPageReadUser;
+
+ /**
+ * ori_page_read_count
+ * 原文页的阅读次数
+ */
+ @SerializedName("ori_page_read_count")
+ private Integer oriPageReadCount;
+
+ /**
+ * share_scene
+ * 分享的场景 1代表好友转发 2代表朋友圈 3代表腾讯微博 255代表其他
+ */
+ @SerializedName("share_scene")
+ private Integer shareScene;
+
+ /**
+ * share_user
+ * 分享的人数
+ */
+ @SerializedName("share_user")
+ private Integer shareUser;
+
+ /**
+ * share_count
+ * 分享的次数
+ */
+ @SerializedName("share_count")
+ private Integer shareCount;
+
+ /**
+ * add_to_fav_user
+ * 收藏的人数
+ */
+ @SerializedName("add_to_fav_user")
+ private Integer addToFavUser;
+
+ /**
+ * add_to_fav_count
+ * 收藏的次数
+ */
+ @SerializedName("add_to_fav_count")
+ private Integer addToFavCount;
+
+ /**
+ * user_source
+ * 在获取图文阅读分时数据时才有该字段,代表用户从哪里进入来阅读该图文。0:会话;1.好友;2.朋友圈;3.腾讯微博;4.历史消息页;5.其他
+ */
+ @SerializedName("user_source")
+ private Integer userSource;
+
+ public static List
- * Created by Binary Wang on 2016/8/30.
- *
- * @author Binary Wang
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
- private static final long serialVersionUID = 597734329161281398L;
-
- /**
- * ref_hour
- * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
- */
- @SerializedName("ref_hour")
- private Integer refHour;
-
- /**
- * callback_count
- * 通过服务器配置地址获得消息后,被动回复用户消息的次数
- */
- @SerializedName("callback_count")
- private Integer callbackCount;
-
- /**
- * fail_count
- * 上述动作的失败次数
- */
- @SerializedName("fail_count")
- private Integer failCount;
-
- /**
- * total_time_cost
- * 总耗时,除以callback_count即为平均耗时
- */
- @SerializedName("total_time_cost")
- private Integer totalTimeCost;
-
- /**
- * max_time_cost
- * 最大耗时
- */
- @SerializedName("max_time_cost")
- private Integer maxTimeCost;
-
- public static List
+ * Created by Binary Wang on 2016/8/30.
+ *
+ * @author Binary Wang
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
+ private static final long serialVersionUID = 597734329161281398L;
+
+ /**
+ * ref_hour
+ * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
+ */
+ @SerializedName("ref_hour")
+ private Integer refHour;
+
+ /**
+ * callback_count
+ * 通过服务器配置地址获得消息后,被动回复用户消息的次数
+ */
+ @SerializedName("callback_count")
+ private Integer callbackCount;
+
+ /**
+ * fail_count
+ * 上述动作的失败次数
+ */
+ @SerializedName("fail_count")
+ private Integer failCount;
+
+ /**
+ * total_time_cost
+ * 总耗时,除以callback_count即为平均耗时
+ */
+ @SerializedName("total_time_cost")
+ private Integer totalTimeCost;
+
+ /**
+ * max_time_cost
+ * 最大耗时
+ */
+ @SerializedName("max_time_cost")
+ private Integer maxTimeCost;
+
+ public static List>() {
- }.getType());
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 图文分析数据接口返回结果对象
+ *
>() {
+ }.getType());
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
index 6c63e83231..bef0e66d15 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
@@ -1,50 +1,50 @@
-package me.chanjar.weixin.mp.bean.datacube;
-
-import com.google.gson.annotations.SerializedName;
-import com.google.gson.reflect.TypeToken;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-
-import java.util.List;
-
-/**
- * 图文分析数据接口返回结果对象.
- * Created by Binary Wang on 2016/8/24.
- *
- * @author Binary Wang
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
- private static final long serialVersionUID = -7634365687303052699L;
-
- /**
- * msgid.
- * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
- */
- @SerializedName("msgid")
- private String msgId;
-
- /**
- * title.
- * 图文消息的标题
- */
- @SerializedName("title")
- private String title;
-
- /**
- * details.
- * 详细信息
- */
- @SerializedName("details")
- private List
>() {
- }.getType());
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 图文分析数据接口返回结果对象.
+ * Created by Binary Wang on 2016/8/24.
+ *
+ * @author Binary Wang
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
+ private static final long serialVersionUID = -7634365687303052699L;
+
+ /**
+ * msgid.
+ * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
+ */
+ @SerializedName("msgid")
+ private String msgId;
+
+ /**
+ * title.
+ * 图文消息的标题
+ */
+ @SerializedName("title")
+ private String title;
+
+ /**
+ * details.
+ * 详细信息
+ */
+ @SerializedName("details")
+ private List
>() {
+ }.getType());
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
index 8af64015b7..df86ab4e15 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
@@ -1,35 +1,35 @@
-package me.chanjar.weixin.mp.bean.datacube;
-
-import com.google.gson.JsonParser;
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import me.chanjar.weixin.common.util.ToStringUtils;
-
-import java.io.Serializable;
-
-/**
- *
- * 统计接口的共用属性类.
- * Created by Binary Wang on 2016/8/25.
- *
- *
- * @author Binary Wang
- */
-@Data
-public abstract class WxDataCubeBaseResult implements Serializable {
- private static final long serialVersionUID = 8780389911053297600L;
- protected static final JsonParser JSON_PARSER = new JsonParser();
-
- /**
- * ref_date.
- * 数据的日期,需在begin_date和end_date之间
- */
- @SerializedName("ref_date")
- private String refDate;
-
- @Override
- public String toString() {
- return ToStringUtils.toSimpleString(this);
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.JsonParser;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.ToStringUtils;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 统计接口的共用属性类.
+ * Created by Binary Wang on 2016/8/25.
+ *
+ *
+ * @author Binary Wang
+ */
+@Data
+public abstract class WxDataCubeBaseResult implements Serializable {
+ private static final long serialVersionUID = 8780389911053297600L;
+ protected static final JsonParser JSON_PARSER = new JsonParser();
+
+ /**
+ * ref_date.
+ * 数据的日期,需在begin_date和end_date之间
+ */
+ @SerializedName("ref_date")
+ private String refDate;
+
+ @Override
+ public String toString() {
+ return ToStringUtils.toSimpleString(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
index cf77b28575..b151c0089f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
@@ -1,65 +1,65 @@
-package me.chanjar.weixin.mp.bean.datacube;
-
-import com.google.gson.annotations.SerializedName;
-import com.google.gson.reflect.TypeToken;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-
-import java.util.List;
-
-/**
- * 接口分析数据接口返回结果对象
- * >() {
- }.getType());
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 接口分析数据接口返回结果对象
+ *
>() {
+ }.getType());
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
index a786605c9e..1e7e1f58c2 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
@@ -1,78 +1,78 @@
-package me.chanjar.weixin.mp.bean.datacube;
-
-import com.google.gson.annotations.SerializedName;
-import com.google.gson.reflect.TypeToken;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-
-import java.util.List;
-
-/**
- * 消息分析数据接口返回结果对象.
- * Created by Binary Wang on 2016/8/29.
- *
- * @author Binary Wang
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
- private static final long serialVersionUID = 6932121822150573659L;
-
- /**
- * ref_hour.
- * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
- */
- @SerializedName("ref_hour")
- private Integer refHour;
-
- /**
- * msg_type.
- * 消息类型,代表含义如下:1代表文字 2代表图片 3代表语音 4代表视频 6代表第三方应用消息(链接消息)
- */
- @SerializedName("msg_type")
- private Integer msgType;
-
- /**
- * msg_user.
- * 上行发送了(向公众号发送了)消息的用户数
- */
- @SerializedName("msg_user")
- private Integer msgUser;
-
- /**
- * msg_count.
- * 上行发送了消息的消息总数
- */
- @SerializedName("msg_count")
- private Integer msgCount;
-
- /**
- * count_interval.
- * 当日发送消息量分布的区间,0代表 “0”,1代表“1-5”,2代表“6-10”,3代表“10次以上”
- */
- @SerializedName("count_interval")
- private Integer countInterval;
-
- /**
- * int_page_read_count
- * 图文页的阅读次数
- */
- @SerializedName("int_page_read_count")
- private Integer intPageReadCount;
-
- /**
- * ori_page_read_user.
- * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
- */
- @SerializedName("ori_page_read_user")
- private Integer oriPageReadUser;
-
- public static List
>() {
- }.getType());
- }
-
-}
+package me.chanjar.weixin.mp.bean.datacube;
+
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 消息分析数据接口返回结果对象.
+ * Created by Binary Wang on 2016/8/29.
+ *
+ * @author Binary Wang
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
+ private static final long serialVersionUID = 6932121822150573659L;
+
+ /**
+ * ref_hour.
+ * 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
+ */
+ @SerializedName("ref_hour")
+ private Integer refHour;
+
+ /**
+ * msg_type.
+ * 消息类型,代表含义如下:1代表文字 2代表图片 3代表语音 4代表视频 6代表第三方应用消息(链接消息)
+ */
+ @SerializedName("msg_type")
+ private Integer msgType;
+
+ /**
+ * msg_user.
+ * 上行发送了(向公众号发送了)消息的用户数
+ */
+ @SerializedName("msg_user")
+ private Integer msgUser;
+
+ /**
+ * msg_count.
+ * 上行发送了消息的消息总数
+ */
+ @SerializedName("msg_count")
+ private Integer msgCount;
+
+ /**
+ * count_interval.
+ * 当日发送消息量分布的区间,0代表 “0”,1代表“1-5”,2代表“6-10”,3代表“10次以上”
+ */
+ @SerializedName("count_interval")
+ private Integer countInterval;
+
+ /**
+ * int_page_read_count
+ * 图文页的阅读次数
+ */
+ @SerializedName("int_page_read_count")
+ private Integer intPageReadCount;
+
+ /**
+ * ori_page_read_user.
+ * 原文页(点击图文页“阅读原文”进入的页面)的阅读人数,无原文页时此处数据为0
+ */
+ @SerializedName("ori_page_read_user")
+ private Integer oriPageReadUser;
+
+ public static List
>() {
+ }.getType());
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/BaseResp.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/BaseResp.java
index 207c1921b8..5c66b0cd60 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/BaseResp.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/BaseResp.java
@@ -1,31 +1,31 @@
-package me.chanjar.weixin.mp.bean.device;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * @author keungtung.
- * @date 10/12/2016
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class BaseResp extends AbstractDeviceBean {
- private static final long serialVersionUID = 4252655933699659073L;
-
- @SerializedName("base_info")
- private BaseInfo baseInfo;
- @SerializedName("errcode")
- private Integer errCode;
- @SerializedName("errmsg")
- private String errMsg;
-
- @Data
- private class BaseInfo {
- @SerializedName("device_type")
- private String deviceType;
-
- @SerializedName("device_id")
- private String deviceId;
- }
-}
+package me.chanjar.weixin.mp.bean.device;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author keungtung.
+ * @date 10/12/2016
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseResp extends AbstractDeviceBean {
+ private static final long serialVersionUID = 4252655933699659073L;
+
+ @SerializedName("base_info")
+ private BaseInfo baseInfo;
+ @SerializedName("errcode")
+ private Integer errCode;
+ @SerializedName("errmsg")
+ private String errMsg;
+
+ @Data
+ private class BaseInfo {
+ @SerializedName("device_type")
+ private String deviceType;
+
+ @SerializedName("device_id")
+ private String deviceId;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/RespMsg.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/RespMsg.java
index de9dccd429..601f848223 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/RespMsg.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/RespMsg.java
@@ -1,21 +1,21 @@
-package me.chanjar.weixin.mp.bean.device;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- *
- * @author keungtung.
- * @date 10/12/2016
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class RespMsg extends AbstractDeviceBean {
- private static final long serialVersionUID = -4241272701707684136L;
-
- @SerializedName("ret_code")
- private Integer retCode;
- @SerializedName("error_info")
- private String errorInfo;
-}
+package me.chanjar.weixin.mp.bean.device;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ *
+ * @author keungtung.
+ * @date 10/12/2016
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class RespMsg extends AbstractDeviceBean {
+ private static final long serialVersionUID = -4241272701707684136L;
+
+ @SerializedName("ret_code")
+ private Integer retCode;
+ @SerializedName("error_info")
+ private String errorInfo;
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/TransMsgResp.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/TransMsgResp.java
index 289816a782..f2b35da5ea 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/TransMsgResp.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/TransMsgResp.java
@@ -1,29 +1,29 @@
-package me.chanjar.weixin.mp.bean.device;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import me.chanjar.weixin.common.util.json.WxGsonBuilder;
-
-/**
- *
- * @author keungtung.
- * @date 14/12/2016
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class TransMsgResp extends AbstractDeviceBean {
- private static final long serialVersionUID = 5386954916622816491L;
-
- private Integer ret;
- @SerializedName("ret_info")
- private String retInfo;
- @SerializedName("errcode")
- private Integer errCode;
- @SerializedName("errmsg")
- private String errMsg;
-
- public static TransMsgResp fromJson(String json) {
- return WxGsonBuilder.create().fromJson(json, TransMsgResp.class);
- }
-}
+package me.chanjar.weixin.mp.bean.device;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+/**
+ *
+ * @author keungtung.
+ * @date 14/12/2016
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class TransMsgResp extends AbstractDeviceBean {
+ private static final long serialVersionUID = 5386954916622816491L;
+
+ private Integer ret;
+ @SerializedName("ret_info")
+ private String retInfo;
+ @SerializedName("errcode")
+ private Integer errCode;
+ @SerializedName("errmsg")
+ private String errMsg;
+
+ public static TransMsgResp fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, TransMsgResp.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/WxDeviceAuthorize.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/WxDeviceAuthorize.java
index ed02aedc70..5e00c4faea 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/WxDeviceAuthorize.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/device/WxDeviceAuthorize.java
@@ -1,32 +1,32 @@
-package me.chanjar.weixin.mp.bean.device;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @author keungtung
- * @date 10/12/2016
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class WxDeviceAuthorize extends AbstractDeviceBean {
- private static final long serialVersionUID = 8786321356569903887L;
-
- @SerializedName("device_num")
- private String deviceNum;
- @SerializedName("op_type")
- private String opType;
- @SerializedName("product_id")
- private String productId;
- @SerializedName("device_list")
- private List