新增代金券接口&字段上的单行注释调整为文档多行注释
This commit is contained in:
@@ -47,4 +47,8 @@ weixin4j-base
|
||||
|
||||
+ 重构token实现机制
|
||||
|
||||
+ 新增JSTICKET支持
|
||||
+ 新增JSTICKET支持
|
||||
|
||||
* 2015-03-29
|
||||
|
||||
+ 单行注释调整为多行文档注释
|
||||
@@ -196,10 +196,11 @@ public class HttpRequest {
|
||||
EntityUtils.consume(httpEntity);
|
||||
Header contentType = httpResponse
|
||||
.getFirstHeader(HttpHeaders.CONTENT_TYPE);
|
||||
System.err.println(response.getAsString());
|
||||
// error with html
|
||||
if (contentType.getValue().contains(
|
||||
ContentType.TEXT_HTML.getMimeType())) {
|
||||
response.setText(new String(data, "gbk"));
|
||||
// response.setText(new String(data, "gbk"));
|
||||
try {
|
||||
checkJson(response);
|
||||
return response;
|
||||
|
||||
@@ -16,18 +16,38 @@ public class BaseMsg implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 7761192742840031607L;
|
||||
|
||||
/**
|
||||
* 开发者微信号
|
||||
*/
|
||||
@XStreamAlias("ToUserName")
|
||||
private String toUserName; // 开发者微信号
|
||||
private String toUserName;
|
||||
/**
|
||||
* 发送方账号 即用户的openid
|
||||
*/
|
||||
@XStreamAlias("FromUserName")
|
||||
private String fromUserName; // 发送方帐号(一个OpenID)
|
||||
private String fromUserName;
|
||||
/**
|
||||
* 消息创建时间 系统毫秒数
|
||||
*/
|
||||
@XStreamAlias("CreateTime")
|
||||
private long createTime = System.currentTimeMillis(); // 消息创建时间 (整型)
|
||||
private long createTime = System.currentTimeMillis();
|
||||
/**
|
||||
* 消息类型
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.type.MessageType
|
||||
*/
|
||||
@XStreamAlias("MsgType")
|
||||
private String msgType; // 消息类型
|
||||
private String msgType;
|
||||
/**
|
||||
* 消息ID 可用于排重
|
||||
*/
|
||||
@XStreamAlias("MsgId")
|
||||
private long msgId; // 消息ID
|
||||
private long msgId;
|
||||
@XStreamAlias("AgentID")
|
||||
private String agentId; // 企业号独有的应用ID
|
||||
/**
|
||||
* 企业号独有的应用ID
|
||||
*/
|
||||
private String agentId;
|
||||
|
||||
public BaseMsg() {
|
||||
|
||||
|
||||
@@ -24,17 +24,39 @@ public class Button implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -6422234732203854866L;
|
||||
|
||||
/**
|
||||
* 菜单标题,不超过16个字节,子菜单不超过40个字节
|
||||
*/
|
||||
private String name;
|
||||
private ButtonType type; // 菜单的响应动作类型
|
||||
private String key; // click等点击类型必须
|
||||
private String url; // view类型必须
|
||||
|
||||
/**
|
||||
* 菜单的响应动作类型
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.type.ButtonType
|
||||
*/
|
||||
private ButtonType type;
|
||||
/**
|
||||
* 菜单KEY值,用于消息接口推送,不超过128字节
|
||||
*/
|
||||
private String key;
|
||||
/**
|
||||
* view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节
|
||||
*/
|
||||
private String url;
|
||||
/**
|
||||
* 二级菜单数组,个数应为1~5个
|
||||
*/
|
||||
@JSONField(name = "sub_button")
|
||||
private List<Button> subs;
|
||||
|
||||
public Button() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建一个菜单
|
||||
* @param name 菜单显示的名称
|
||||
* @param value 当buttonType为view时value设置为url,否则为key.
|
||||
* @param buttonType 按钮类型
|
||||
*/
|
||||
public Button(String name, String value, ButtonType buttonType) {
|
||||
this.name = name;
|
||||
this.type = buttonType;
|
||||
|
||||
@@ -24,13 +24,36 @@ public final class Consts {
|
||||
public static final String PROTOCOL_FILE = "file";
|
||||
public static final String PROTOCOL_JAR = "jar";
|
||||
|
||||
/**
|
||||
* oauth验证url
|
||||
*/
|
||||
public static final String OAUTH_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";
|
||||
/**
|
||||
* 公众平台获取token的url
|
||||
*/
|
||||
public static final String MP_ASSESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
|
||||
/**
|
||||
* 企业号获取token的url
|
||||
*/
|
||||
public static final String QY_ASSESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
|
||||
/**
|
||||
* jssdk获取token的url
|
||||
*/
|
||||
public static final String JS_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi";
|
||||
|
||||
/**
|
||||
* 商户平台下统一订单生成的url
|
||||
*/
|
||||
public static final String UNIFIEDORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
|
||||
/**
|
||||
* 商户平台下刷卡支付的url
|
||||
*/
|
||||
public static final String MICROPAYURL = "https://api.mch.weixin.qq.com/pay/micropay";
|
||||
/**
|
||||
* 商户平台下native支付的url
|
||||
*/
|
||||
public static final String NATIVEURLV2 = "weixin://wxpay/bizpayurl?sign=%s&appid=%s&productid=%s×tamp=%s&noncestr=%s";
|
||||
/**
|
||||
* V2支付下natvie支付的url
|
||||
*/
|
||||
public static final String NATIVEURLV3 = "weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s";
|
||||
}
|
||||
|
||||
@@ -10,5 +10,16 @@ package com.foxinmy.weixin4j.model;
|
||||
* @see
|
||||
*/
|
||||
public enum Gender {
|
||||
male, female, unknown;
|
||||
/**
|
||||
* 男
|
||||
*/
|
||||
male,
|
||||
/**
|
||||
* 女
|
||||
*/
|
||||
female,
|
||||
/**
|
||||
* 未知
|
||||
*/
|
||||
unknown;
|
||||
}
|
||||
|
||||
@@ -21,10 +21,19 @@ public class Token implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -7564855472419104084L;
|
||||
|
||||
/**
|
||||
* 获取到的凭证
|
||||
*/
|
||||
@JSONField(name = "access_token")
|
||||
private String accessToken;
|
||||
/**
|
||||
* 凭证有效时间,单位:秒
|
||||
*/
|
||||
@JSONField(name = "expires_in")
|
||||
private int expiresIn;
|
||||
/**
|
||||
* token创建的时间 只在FileTokenHolder模式下有效
|
||||
*/
|
||||
private long time;
|
||||
|
||||
public Token() {
|
||||
|
||||
@@ -20,14 +20,23 @@ import com.foxinmy.weixin4j.type.AccountType;
|
||||
public abstract class WeixinAccount implements Serializable {
|
||||
private static final long serialVersionUID = -6001008896414323534L;
|
||||
|
||||
// 唯一的身份标识
|
||||
/**
|
||||
* 唯一的身份标识
|
||||
*/
|
||||
private String id;
|
||||
// 调用接口的密钥
|
||||
/**
|
||||
* 调用接口的密钥
|
||||
*/
|
||||
private String secret;
|
||||
private String token;
|
||||
// 安全模式下的加密密钥
|
||||
/**
|
||||
* 安全模式下的加密密钥
|
||||
*/
|
||||
private String encodingAesKey;
|
||||
|
||||
/**
|
||||
* 账号类型
|
||||
* @return
|
||||
*/
|
||||
public abstract AccountType getAccountType();
|
||||
|
||||
public WeixinAccount() {
|
||||
|
||||
@@ -12,26 +12,44 @@ import com.foxinmy.weixin4j.type.AccountType;
|
||||
* @author jy
|
||||
* @date 2014年8月17日
|
||||
* @since JDK 1.7
|
||||
* @see<a href=
|
||||
* "https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=836970804&lang=zh_CN"
|
||||
* >开发者模式</a>
|
||||
* @see <a href=
|
||||
* "https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=836970804&lang=zh_CN"
|
||||
* >开发者模式</a>
|
||||
*/
|
||||
public class WeixinMpAccount extends WeixinAccount {
|
||||
private static final long serialVersionUID = 3689999353867189585L;
|
||||
|
||||
// 支付场景下为用户的openid 其余情况可能是公众号的原始ID
|
||||
/**
|
||||
* 支付场景下为用户的openid 其余情况可能是公众号的原始ID
|
||||
*/
|
||||
private String openId;
|
||||
// 公众号支付请求中用于加密的密钥 Key,可验证商户唯一身份,PaySignKey 对应于支付场景中的 appKey 值
|
||||
/**
|
||||
* 公众号支付请求中用于加密的密钥 Key,可验证商户唯一身份,PaySignKey 对应于支付场景中的 appKey 值
|
||||
*/
|
||||
private String paySignKey;
|
||||
// 财付通商户身份的标识
|
||||
/**
|
||||
* 财付通商户身份的标识
|
||||
*/
|
||||
private String partnerId;
|
||||
// 财付通商户权限密钥Key
|
||||
/**
|
||||
* 财付通商户权限密钥Key
|
||||
*/
|
||||
private String partnerKey;
|
||||
// 微信支付商户号V3.x版本
|
||||
/**
|
||||
* 微信支付分配的商户号(商户平台版)
|
||||
*/
|
||||
private String mchId;
|
||||
// 微信支付分配的设备号
|
||||
/**
|
||||
* 微信支付分配的子商户号,受理模式下必填(商户平台版)
|
||||
*/
|
||||
private String subMchId;
|
||||
/**
|
||||
* 微信支付分配的设备号(商户平台版)
|
||||
*/
|
||||
private String deviceInfo;
|
||||
// 微信支付版本号(如果无则按照mchId来做判断)
|
||||
/**
|
||||
* 微信支付版本号(如果无则按照mchId来做判断)
|
||||
*/
|
||||
private int version;
|
||||
|
||||
public String getOpenId() {
|
||||
@@ -93,6 +111,14 @@ public class WeixinMpAccount extends WeixinAccount {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getSubMchId() {
|
||||
return subMchId;
|
||||
}
|
||||
|
||||
public void setSubMchId(String subMchId) {
|
||||
this.subMchId = subMchId;
|
||||
}
|
||||
|
||||
public WeixinMpAccount() {
|
||||
|
||||
}
|
||||
@@ -102,12 +128,12 @@ public class WeixinMpAccount extends WeixinAccount {
|
||||
}
|
||||
|
||||
/**
|
||||
* V3版本字段
|
||||
* 商户平台版本(V3)字段
|
||||
*
|
||||
* @param appId
|
||||
* @param appSecret
|
||||
* @param paySignKey
|
||||
* @param mchId
|
||||
* @param appId 公众号唯一的身份ID
|
||||
* @param appSecret 调用接口的凭证
|
||||
* @param paySignKey 支付密钥字符串
|
||||
* @param mchId 微信支付分配的商户号
|
||||
*/
|
||||
public WeixinMpAccount(String appId, String appSecret, String paySignKey,
|
||||
String mchId) {
|
||||
@@ -119,11 +145,11 @@ public class WeixinMpAccount extends WeixinAccount {
|
||||
/**
|
||||
* V2版本字段
|
||||
*
|
||||
* @param appId
|
||||
* @param appSecret
|
||||
* @param paySignKey
|
||||
* @param partnerId
|
||||
* @param partnerKey
|
||||
* @param appId 公众号唯一的身份ID
|
||||
* @param appSecret 调用接口的凭证
|
||||
* @param paySignKey 支付密钥字符串
|
||||
* @param partnerId 财付通账号的ID
|
||||
* @param partnerKey 财付通账号的key
|
||||
*/
|
||||
public WeixinMpAccount(String appId, String appSecret, String paySignKey,
|
||||
String partnerId, String partnerKey) {
|
||||
|
||||
@@ -20,6 +20,13 @@ public class WeixinQyAccount extends WeixinAccount {
|
||||
public WeixinQyAccount() {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param corpid
|
||||
* 企业ID
|
||||
* @param corpsecret
|
||||
* 管理组的凭证密钥
|
||||
*/
|
||||
public WeixinQyAccount(String corpid, String corpsecret) {
|
||||
super(corpid, corpsecret);
|
||||
}
|
||||
|
||||
@@ -24,10 +24,16 @@ public class ImageMessage extends BaseMsg {
|
||||
super(MessageType.image.name());
|
||||
}
|
||||
|
||||
/**
|
||||
* 图片链接
|
||||
*/
|
||||
@XStreamAlias("PicUrl")
|
||||
private String picUrl; // 图片链接
|
||||
private String picUrl;
|
||||
/**
|
||||
* 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
|
||||
*/
|
||||
@XStreamAlias("MediaId")
|
||||
private String mediaId; // 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
|
||||
private String mediaId;
|
||||
|
||||
public String getPicUrl() {
|
||||
return picUrl;
|
||||
|
||||
@@ -22,12 +22,21 @@ public class LinkMessage extends BaseMsg {
|
||||
super(MessageType.link.name());
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
@XStreamAlias("Title")
|
||||
private String title; // 消息标题
|
||||
private String title;
|
||||
/**
|
||||
* 消息描述
|
||||
*/
|
||||
@XStreamAlias("Description")
|
||||
private String description; // 消息描述
|
||||
@XStreamAlias("url")
|
||||
private String url; // 消息链接
|
||||
private String description;
|
||||
/**
|
||||
* 消息链接
|
||||
*/
|
||||
@XStreamAlias("Url")
|
||||
private String url;
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
|
||||
@@ -24,14 +24,26 @@ public class LocationMessage extends BaseMsg {
|
||||
super(MessageType.location.name());
|
||||
}
|
||||
|
||||
/**
|
||||
* 地理位置维度
|
||||
*/
|
||||
@XStreamAlias("Location_X")
|
||||
private double x; // 地理位置维度
|
||||
private double x;
|
||||
/**
|
||||
* 地理位置经度
|
||||
*/
|
||||
@XStreamAlias("Location_Y")
|
||||
private double y; // 地理位置经度
|
||||
private double y;
|
||||
/**
|
||||
* 地图缩放大小
|
||||
*/
|
||||
@XStreamAlias("Scale")
|
||||
private double scale; // 地图缩放大小
|
||||
private double scale;
|
||||
/**
|
||||
* 地理位置信息
|
||||
*/
|
||||
@XStreamAlias("Label")
|
||||
private String label; // 地理位置信息
|
||||
private String label;
|
||||
|
||||
public double getX() {
|
||||
return x;
|
||||
@@ -49,10 +61,6 @@ public class LocationMessage extends BaseMsg {
|
||||
return label;
|
||||
}
|
||||
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "LocationMessage [x=" + x + ", y=" + y + ", scale=" + scale
|
||||
|
||||
@@ -1 +1,10 @@
|
||||
普通消息
|
||||
普通消息
|
||||
-------
|
||||
|
||||
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。各消息类型的推送XML数据包结构如下:
|
||||
|
||||
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
|
||||
|
||||
关于重试的消息排重,推荐使用msgid排重。
|
||||
|
||||
假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
|
||||
@@ -1,39 +1,42 @@
|
||||
package com.foxinmy.weixin4j.msg;
|
||||
|
||||
import com.foxinmy.weixin4j.model.BaseMsg;
|
||||
import com.foxinmy.weixin4j.type.MessageType;
|
||||
import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
|
||||
/**
|
||||
* 文本消息
|
||||
*
|
||||
* @className TextMessage
|
||||
* @author jy.hu
|
||||
* @date 2014年4月6日
|
||||
* @since JDK 1.7
|
||||
* @see <a
|
||||
* href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E6.96.87.E6.9C.AC.E6.B6.88.E6.81.AF">订阅号、服务号的文本消息</a>
|
||||
* @see <a
|
||||
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E6%99%AE%E9%80%9A%E6%B6%88%E6%81%AF#text.E6.B6.88.E6.81.AF">企业号的文本消息</a>
|
||||
*/
|
||||
public class TextMessage extends BaseMsg {
|
||||
|
||||
private static final long serialVersionUID = -7018053906644190260L;
|
||||
|
||||
public TextMessage() {
|
||||
super(MessageType.text.name());
|
||||
}
|
||||
|
||||
@XStreamAlias("Content")
|
||||
private String content; // 消息内容
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TextMessage [content=" + content + ", " + super.toString()
|
||||
+ "]";
|
||||
}
|
||||
}
|
||||
package com.foxinmy.weixin4j.msg;
|
||||
|
||||
import com.foxinmy.weixin4j.model.BaseMsg;
|
||||
import com.foxinmy.weixin4j.type.MessageType;
|
||||
import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
|
||||
/**
|
||||
* 文本消息
|
||||
*
|
||||
* @className TextMessage
|
||||
* @author jy.hu
|
||||
* @date 2014年4月6日
|
||||
* @since JDK 1.7
|
||||
* @see <a
|
||||
* href="http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html#.E6.96.87.E6.9C.AC.E6.B6.88.E6.81.AF">订阅号、服务号的文本消息</a>
|
||||
* @see <a
|
||||
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E6%99%AE%E9%80%9A%E6%B6%88%E6%81%AF#text.E6.B6.88.E6.81.AF">企业号的文本消息</a>
|
||||
*/
|
||||
public class TextMessage extends BaseMsg {
|
||||
|
||||
private static final long serialVersionUID = -7018053906644190260L;
|
||||
|
||||
public TextMessage() {
|
||||
super(MessageType.text.name());
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
@XStreamAlias("Content")
|
||||
private String content;
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TextMessage [content=" + content + ", " + super.toString()
|
||||
+ "]";
|
||||
}
|
||||
}
|
||||
@@ -24,10 +24,16 @@ public class VideoMessage extends BaseMsg {
|
||||
super(MessageType.video.name());
|
||||
}
|
||||
|
||||
/**
|
||||
* 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
|
||||
*/
|
||||
@XStreamAlias("MediaId")
|
||||
private String mediaId; // 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
|
||||
private String mediaId;
|
||||
/**
|
||||
* 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
|
||||
*/
|
||||
@XStreamAlias("ThumbMediaId")
|
||||
private String thumbMediaId; // 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
|
||||
private String thumbMediaId;
|
||||
|
||||
public String getMediaId() {
|
||||
return mediaId;
|
||||
|
||||
@@ -27,13 +27,21 @@ public class VoiceMessage extends BaseMsg {
|
||||
super(MessageType.voice.name());
|
||||
}
|
||||
|
||||
/**
|
||||
* 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
|
||||
*/
|
||||
@XStreamAlias("MediaId")
|
||||
private String mediaId; // 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
|
||||
private String mediaId;
|
||||
/**
|
||||
* 语音格式,如amr,speex等
|
||||
*/
|
||||
@XStreamAlias("Format")
|
||||
private String format; // 语音格式,如amr,speex等
|
||||
|
||||
private String format;
|
||||
/**
|
||||
* 语音识别结果,UTF8编码
|
||||
*/
|
||||
@XStreamAlias("Recognition")
|
||||
private String recognition; // 语音识别结果,UTF8编码
|
||||
private String recognition;
|
||||
|
||||
public String getRecognition() {
|
||||
return recognition;
|
||||
|
||||
+7
-4
@@ -10,9 +10,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
* @author jy
|
||||
* @date 2014年12月28日
|
||||
* @since JDK 1.7
|
||||
* @see<a href=
|
||||
* "http://qydev.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E4%BA%8B%E4%BB%B6#.E7.94.A8.E6.88.B7.E8.BF.9B.E5.85.A5.E5.BA.94.E7.94.A8.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81"
|
||||
* >用户进入应用的事件推送</a>
|
||||
* @see <a href=
|
||||
* "http://qydev.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E4%BA%8B%E4%BB%B6#.E7.94.A8.E6.88.B7.E8.BF.9B.E5.85.A5.E5.BA.94.E7.94.A8.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81"
|
||||
* >用户进入应用的事件推送</a>
|
||||
*/
|
||||
public class EnterAgentEventMessage extends EventMessage {
|
||||
|
||||
@@ -22,8 +22,11 @@ public class EnterAgentEventMessage extends EventMessage {
|
||||
super(EventType.enter_agent);
|
||||
}
|
||||
|
||||
/**
|
||||
* 事件KEY值,与自定义菜单接口中KEY值对应
|
||||
*/
|
||||
@XStreamAlias("EventKey")
|
||||
private String eventKey; // 事件KEY值,与自定义菜单接口中KEY值对应
|
||||
private String eventKey;
|
||||
|
||||
public String getEventKey() {
|
||||
return eventKey;
|
||||
|
||||
@@ -26,6 +26,11 @@ public class EventMessage extends BaseMsg {
|
||||
this.eventType = eventType;
|
||||
}
|
||||
|
||||
/**
|
||||
* 事件类型
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.type.EventType
|
||||
*/
|
||||
@XStreamAlias("Event")
|
||||
private EventType eventType;
|
||||
|
||||
|
||||
@@ -21,17 +21,16 @@ public class KfCloseEventMessage extends EventMessage {
|
||||
super(EventType.kf_close_session);
|
||||
}
|
||||
|
||||
/**
|
||||
* 客服账号
|
||||
*/
|
||||
@XStreamAlias("KfAccount")
|
||||
private String kfAccount; // 客服账号
|
||||
private String kfAccount;
|
||||
|
||||
public String getKfAccount() {
|
||||
return kfAccount;
|
||||
}
|
||||
|
||||
public void setKfAccount(String kfAccount) {
|
||||
this.kfAccount = kfAccount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "KfCloseEventMessage [kfAccount=" + kfAccount + ", ="
|
||||
|
||||
+5
-6
@@ -14,24 +14,23 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
* href="http://mp.weixin.qq.com/wiki/2/6c20f3e323bdf5986cfcb33cbd3b829a.html#.E4.BC.9A.E8.AF.9D.E7.8A.B6.E6.80.81.E9.80.9A.E7.9F.A5.E4.BA.8B.E4.BB.B6">会话状态通知事件</a>
|
||||
*/
|
||||
public class KfCreateEventMessage extends EventMessage {
|
||||
|
||||
|
||||
private static final long serialVersionUID = -8968189700999202108L;
|
||||
|
||||
public KfCreateEventMessage() {
|
||||
super(EventType.kf_create_session);
|
||||
}
|
||||
|
||||
/**
|
||||
* 客服账号
|
||||
*/
|
||||
@XStreamAlias("KfAccount")
|
||||
private String kfAccount; // 客服账号
|
||||
private String kfAccount;
|
||||
|
||||
public String getKfAccount() {
|
||||
return kfAccount;
|
||||
}
|
||||
|
||||
public void setKfAccount(String kfAccount) {
|
||||
this.kfAccount = kfAccount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "KfCreateEventMessage [kfAccount=" + kfAccount + ", ="
|
||||
|
||||
+8
-12
@@ -20,29 +20,25 @@ public class KfSwitchEventMessage extends EventMessage {
|
||||
public KfSwitchEventMessage() {
|
||||
super(EventType.kf_switch_session);
|
||||
}
|
||||
|
||||
/**
|
||||
* 来自的客服账号
|
||||
*/
|
||||
@XStreamAlias("FromKfAccount")
|
||||
private String fromKfAccount; // 来自的客服账号
|
||||
|
||||
private String fromKfAccount;
|
||||
/**
|
||||
* 转移给客服账号
|
||||
*/
|
||||
@XStreamAlias("ToKfAccount")
|
||||
private String toKfAccount; // 转移给客服账号
|
||||
private String toKfAccount;
|
||||
|
||||
public String getFromKfAccount() {
|
||||
return fromKfAccount;
|
||||
}
|
||||
|
||||
public void setFromKfAccount(String fromKfAccount) {
|
||||
this.fromKfAccount = fromKfAccount;
|
||||
}
|
||||
|
||||
public String getToKfAccount() {
|
||||
return toKfAccount;
|
||||
}
|
||||
|
||||
public void setToKfAccount(String toKfAccount) {
|
||||
this.toKfAccount = toKfAccount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "KfSwitchEventMessage [fromKfAccount=" + fromKfAccount
|
||||
|
||||
+12
-4
@@ -22,13 +22,21 @@ public class LocationEventMessage extends EventMessage {
|
||||
public LocationEventMessage() {
|
||||
super(EventType.location);
|
||||
}
|
||||
|
||||
/**
|
||||
* 地理位置纬度
|
||||
*/
|
||||
@XStreamAlias("Latitude")
|
||||
private String latitude;// 地理位置纬度
|
||||
private String latitude;
|
||||
/**
|
||||
* 地理位置经度
|
||||
*/
|
||||
@XStreamAlias("Longitude")
|
||||
private String longitude;// 地理位置经度
|
||||
private String longitude;
|
||||
/**
|
||||
* 地理位置精度
|
||||
*/
|
||||
@XStreamAlias("Precision")
|
||||
private String precision;// 地理位置精度
|
||||
private String precision;
|
||||
|
||||
public String getLatitude() {
|
||||
return latitude;
|
||||
|
||||
@@ -25,14 +25,30 @@ public class MassEventMessage extends EventMessage {
|
||||
super(EventType.masssendjobfinish);
|
||||
}
|
||||
|
||||
/**
|
||||
* 群发后的状态信息 为“send success”或“send fail”或“err(num)
|
||||
*/
|
||||
@XStreamAlias("Status")
|
||||
private String status;
|
||||
/**
|
||||
* group_id下粉丝数;或者openid_list中的粉丝数
|
||||
*/
|
||||
@XStreamAlias("TotalCount")
|
||||
private int totalCount;
|
||||
/**
|
||||
* 过滤(过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,FilterCount =
|
||||
* SentCount + ErrorCount
|
||||
*/
|
||||
@XStreamAlias("FilterCount")
|
||||
private int filterCount;
|
||||
/**
|
||||
* 发送成功的粉丝数
|
||||
*/
|
||||
@XStreamAlias("SentCount")
|
||||
private int sentCount;
|
||||
/**
|
||||
* 发送失败的粉丝数
|
||||
*/
|
||||
@XStreamAlias("ErrorCount")
|
||||
private int errorCount;
|
||||
|
||||
@@ -63,10 +79,9 @@ public class MassEventMessage extends EventMessage {
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送状态描述</br>
|
||||
* err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)</br>
|
||||
* err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈)</br>
|
||||
* err(20013,涉嫌版权) err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他)
|
||||
* 发送状态描述</br> err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)</br>
|
||||
* err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈)</br> err(20013,涉嫌版权)
|
||||
* err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他)
|
||||
*
|
||||
* @param status
|
||||
* @return 中文描述
|
||||
@@ -76,10 +91,9 @@ public class MassEventMessage extends EventMessage {
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送状态描述</br>
|
||||
* err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)</br>
|
||||
* err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈)</br>
|
||||
* err(20013,涉嫌版权) err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他)
|
||||
* 发送状态描述</br> err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)</br>
|
||||
* err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈)</br> err(20013,涉嫌版权)
|
||||
* err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他)
|
||||
*
|
||||
* @param status
|
||||
* @return 中文描述
|
||||
@@ -106,7 +120,7 @@ public class MassEventMessage extends EventMessage {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "MassEventMessage [status=" + status + ", totalCount="
|
||||
return "MassEventMessage [status=" + getStatusDesc() + ", totalCount="
|
||||
+ totalCount + ", filterCount=" + filterCount + ", sentCount="
|
||||
+ sentCount + ", errorCount=" + errorCount + ", "
|
||||
+ super.toString() + "]";
|
||||
|
||||
@@ -1 +1,10 @@
|
||||
事件消息
|
||||
事件消息
|
||||
-------
|
||||
|
||||
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。各消息类型的推送XML数据包结构如下:
|
||||
|
||||
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
|
||||
|
||||
关于重试的消息排重,推荐使用msgid排重。
|
||||
|
||||
假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
|
||||
@@ -15,6 +15,8 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
*/
|
||||
public class ScanEventMessage extends EventMessage {
|
||||
|
||||
private static final long serialVersionUID = 8078674062833071562L;
|
||||
|
||||
public ScanEventMessage() {
|
||||
super(EventType.scan);
|
||||
}
|
||||
@@ -23,12 +25,16 @@ public class ScanEventMessage extends EventMessage {
|
||||
super(eventType);
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = 8078674062833071562L;
|
||||
|
||||
/**
|
||||
* 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
|
||||
*/
|
||||
@XStreamAlias("EventKey")
|
||||
private String eventKey; // 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
|
||||
private String eventKey;
|
||||
/**
|
||||
* 二维码的ticket,可用来换取二维码图片
|
||||
*/
|
||||
@XStreamAlias("Ticket")
|
||||
private String ticket; // 二维码的ticket,可用来换取二维码图片
|
||||
private String ticket;
|
||||
|
||||
public String getEventKey() {
|
||||
return eventKey;
|
||||
|
||||
+4
-1
@@ -21,8 +21,11 @@ public class TemplatesendjobfinishMessage extends EventMessage {
|
||||
super(EventType.templatesendjobfinish);
|
||||
}
|
||||
|
||||
/**
|
||||
* 推送状态 如failed: system failed
|
||||
*/
|
||||
@XStreamAlias("Status")
|
||||
private String status; // 推送状态
|
||||
private String status;
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
|
||||
+4
-1
@@ -28,8 +28,11 @@ public class MenuEventMessage extends EventMessage {
|
||||
super(eventType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 事件KEY值,与自定义菜单接口中KEY值对应
|
||||
*/
|
||||
@XStreamAlias("EventKey")
|
||||
private String eventKey; // 事件KEY值,与自定义菜单接口中KEY值对应
|
||||
private String eventKey;
|
||||
|
||||
public String getEventKey() {
|
||||
return eventKey;
|
||||
|
||||
+32
-6
@@ -25,6 +25,9 @@ public class MenuLocationEventMessage extends MenuEventMessage {
|
||||
super(EventType.location_select);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送的位置消息
|
||||
*/
|
||||
@XStreamAlias("SendLocationInfo")
|
||||
private LocationInfo locationInfo;
|
||||
|
||||
@@ -32,18 +35,41 @@ public class MenuLocationEventMessage extends MenuEventMessage {
|
||||
return locationInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 地理位置信息
|
||||
* @className LocationInfo
|
||||
* @author jy
|
||||
* @date 2015年3月29日
|
||||
* @since JDK 1.7
|
||||
* @see
|
||||
*/
|
||||
public static class LocationInfo implements Serializable {
|
||||
|
||||
|
||||
private static final long serialVersionUID = 4904181780216819965L;
|
||||
|
||||
|
||||
/**
|
||||
* 地理位置维度
|
||||
*/
|
||||
@XStreamAlias("Location_X")
|
||||
private double x; // 地理位置维度
|
||||
private double x;
|
||||
/**
|
||||
* 地理位置经度
|
||||
*/
|
||||
@XStreamAlias("Location_Y")
|
||||
private double y; // 地理位置经度
|
||||
private double y;
|
||||
/**
|
||||
* 地图缩放大小
|
||||
*/
|
||||
@XStreamAlias("Scale")
|
||||
private double scale; // 地图缩放大小
|
||||
private double scale;
|
||||
/**
|
||||
* 地理位置信息
|
||||
*/
|
||||
@XStreamAlias("Label")
|
||||
private String label; // 地理位置信息
|
||||
private String label;
|
||||
/**
|
||||
* 朋友圈POI的名字,可能为空
|
||||
*/
|
||||
@XStreamAlias("Poiname")
|
||||
private String poiname;
|
||||
|
||||
|
||||
+30
@@ -21,6 +21,9 @@ public class MenuPhotoEventMessage extends MenuEventMessage {
|
||||
|
||||
private static final long serialVersionUID = 3142350663022709730L;
|
||||
|
||||
/**
|
||||
* 发送的图片信息
|
||||
*/
|
||||
@XStreamAlias("SendPicsInfo")
|
||||
private PictureInfo pictureInfo;
|
||||
|
||||
@@ -28,12 +31,27 @@ public class MenuPhotoEventMessage extends MenuEventMessage {
|
||||
return pictureInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 图片信息
|
||||
*
|
||||
* @className PictureInfo
|
||||
* @author jy
|
||||
* @date 2015年3月29日
|
||||
* @since JDK 1.7
|
||||
* @see
|
||||
*/
|
||||
public static class PictureInfo implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -3361375879168233258L;
|
||||
|
||||
/**
|
||||
* 发送的图片数量
|
||||
*/
|
||||
@XStreamAlias("Count")
|
||||
private int count;
|
||||
/**
|
||||
* 图片列表
|
||||
*/
|
||||
@XStreamAlias("PicList")
|
||||
private List<PictureItem> items;
|
||||
|
||||
@@ -51,11 +69,23 @@ public class MenuPhotoEventMessage extends MenuEventMessage {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 图片
|
||||
*
|
||||
* @className PictureItem
|
||||
* @author jy
|
||||
* @date 2015年3月29日
|
||||
* @since JDK 1.7
|
||||
* @see
|
||||
*/
|
||||
@XStreamAlias("item")
|
||||
public static class PictureItem implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -7636697449096645590L;
|
||||
|
||||
/**
|
||||
* 图片的MD5值,开发者若需要,可用于验证接收到图片
|
||||
*/
|
||||
@XStreamAlias("PicMd5Sum")
|
||||
private String md5;
|
||||
|
||||
|
||||
+19
-2
@@ -20,6 +20,9 @@ public class MenuScanEventMessage extends MenuEventMessage {
|
||||
|
||||
private static final long serialVersionUID = 3142350663022709730L;
|
||||
|
||||
/**
|
||||
* 扫描信息
|
||||
*/
|
||||
@XStreamAlias("ScanCodeInfo")
|
||||
private ScanInfo scanInfo;
|
||||
|
||||
@@ -27,12 +30,26 @@ public class MenuScanEventMessage extends MenuEventMessage {
|
||||
return scanInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫描信息
|
||||
*
|
||||
* @className ScanInfo
|
||||
* @author jy
|
||||
* @date 2015年3月29日
|
||||
* @since JDK 1.7
|
||||
* @see
|
||||
*/
|
||||
public static class ScanInfo implements Serializable {
|
||||
|
||||
|
||||
private static final long serialVersionUID = 2237570238164900421L;
|
||||
|
||||
/**
|
||||
* 扫描类型,一般是qrcode
|
||||
*/
|
||||
@XStreamAlias("ScanType")
|
||||
private String type;
|
||||
/**
|
||||
* 扫描结果,即二维码对应的字符串信息
|
||||
*/
|
||||
@XStreamAlias("ScanResult")
|
||||
private String result;
|
||||
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
底部菜单消息
|
||||
菜单消息
|
||||
|
||||
用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。请注意,第3个到第8个的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。
|
||||
@@ -17,17 +17,29 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
public class Article implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -1231352700301456395L;
|
||||
|
||||
|
||||
/**
|
||||
* 图文消息标题
|
||||
*/
|
||||
@XStreamAlias("Title")
|
||||
private String title; // 图文消息标题
|
||||
private String title;
|
||||
/**
|
||||
* 图文消息描述
|
||||
*/
|
||||
@JSONField(name = "description")
|
||||
@XStreamAlias("Description")
|
||||
private String desc; // 图文消息描述
|
||||
private String desc;
|
||||
/**
|
||||
* 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
|
||||
*/
|
||||
@JSONField(name = "picurl")
|
||||
@XStreamAlias("PicUrl")
|
||||
private String picUrl; // 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
|
||||
private String picUrl;
|
||||
/**
|
||||
* 点击图文消息跳转链接
|
||||
*/
|
||||
@XStreamAlias("Url")
|
||||
private String url; // 点击图文消息跳转链接
|
||||
private String url;
|
||||
|
||||
public Article(String title, String desc, String picUrl, String url) {
|
||||
this.title = title;
|
||||
@@ -73,4 +85,4 @@ public class Article implements Serializable {
|
||||
return "Article [title=" + title + ", desc=" + desc + ", picUrl="
|
||||
+ picUrl + ", url=" + url + "]";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,9 @@ public class Base implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 8487251213352068227L;
|
||||
|
||||
/**
|
||||
* 媒体类型
|
||||
*/
|
||||
@JSONField(serialize = false)
|
||||
@XStreamOmitField
|
||||
private MediaType mediaType;
|
||||
|
||||
@@ -19,6 +19,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
public class File extends Base implements Notifyable {
|
||||
private static final long serialVersionUID = -8149837316289636110L;
|
||||
|
||||
/**
|
||||
* 上传后的微信返回的媒体ID
|
||||
*/
|
||||
@JSONField(name = "media_id")
|
||||
@XStreamAlias("MediaId")
|
||||
private String mediaId;
|
||||
|
||||
@@ -20,6 +20,9 @@ public class Image extends Base implements Responseable, Notifyable, Massable {
|
||||
|
||||
private static final long serialVersionUID = 6928681900960656161L;
|
||||
|
||||
/**
|
||||
* 上传后的微信返回的媒体ID
|
||||
*/
|
||||
@JSONField(name = "media_id")
|
||||
@XStreamAlias("MediaId")
|
||||
private String mediaId;
|
||||
|
||||
@@ -15,16 +15,37 @@ public class MpArticle implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 5583479943661639234L;
|
||||
|
||||
/**
|
||||
* 图文消息缩略图的media_id,可以在基础支持-上传多媒体文件接口中获得 非空
|
||||
*/
|
||||
@JSONField(name = "thumb_media_id")
|
||||
private String thumbMediaId; // 图文消息缩略图的media_id,可以在基础支持-上传多媒体文件接口中获得 非空
|
||||
private String author;// 图文消息的作者 可为空
|
||||
private String title;// 图文消息的标题 非空
|
||||
private String thumbMediaId;
|
||||
/**
|
||||
* 图文消息的作者 可为空
|
||||
*/
|
||||
private String author;
|
||||
/**
|
||||
* 图文消息的标题 非空
|
||||
*/
|
||||
private String title;
|
||||
/**
|
||||
* 在图文消息页面点击“阅读原文”后的页面 可为空
|
||||
*/
|
||||
@JSONField(name = "content_source_url")
|
||||
private String url;// 在图文消息页面点击“阅读原文”后的页面 可为空
|
||||
private String content;// 图文消息页面的内容,支持HTML标签 非空
|
||||
private String digest;// 图文消息的描述 可为空
|
||||
private String url;
|
||||
/**
|
||||
* 图文消息页面的内容,支持HTML标签 非空
|
||||
*/
|
||||
private String content;
|
||||
/**
|
||||
* 图文消息的描述 可为空
|
||||
*/
|
||||
private String digest;
|
||||
/**
|
||||
* 是否显示封面,1为显示,0为不显示 可为空
|
||||
*/
|
||||
@JSONField(name = "show_cover_pic")
|
||||
private String showCoverPic; // 是否显示封面,1为显示,0为不显示 可为空
|
||||
private String showCoverPic;
|
||||
|
||||
public MpArticle(String thumbMediaId, String title, String content) {
|
||||
this.thumbMediaId = thumbMediaId;
|
||||
|
||||
@@ -24,9 +24,15 @@ public class MpNews extends Base implements Massable, Notifyable {
|
||||
|
||||
private static final long serialVersionUID = 8853054484809101524L;
|
||||
|
||||
/**
|
||||
* 上传图文列表后微信返回的媒体ID
|
||||
*/
|
||||
@JSONField(name = "media_id")
|
||||
@XStreamAlias("MediaId")
|
||||
private String mediaId;
|
||||
/**
|
||||
* 图文列表
|
||||
*/
|
||||
@JSONField(name = "articles")
|
||||
@XStreamOmitField
|
||||
private List<MpArticle> articles;
|
||||
|
||||
@@ -20,6 +20,9 @@ public class MpVideo extends Base implements Massable {
|
||||
|
||||
private static final long serialVersionUID = 2167437425244069128L;
|
||||
|
||||
/**
|
||||
* 上传视频后微信返回的媒体ID
|
||||
*/
|
||||
@JSONField(name = "media_id")
|
||||
@XStreamAlias("MediaId")
|
||||
private String mediaId;
|
||||
|
||||
@@ -20,17 +20,32 @@ public class Music extends Base implements Responseable, Notifyable {
|
||||
|
||||
private static final long serialVersionUID = -5952134916367253297L;
|
||||
|
||||
/**
|
||||
* 音乐标题
|
||||
*/
|
||||
@XStreamAlias("Title")
|
||||
private String title;
|
||||
/**
|
||||
* 音乐描述
|
||||
*/
|
||||
@JSONField(name = "description")
|
||||
@XStreamAlias("Description")
|
||||
private String desc;
|
||||
/**
|
||||
* 音乐链接
|
||||
*/
|
||||
@JSONField(name = "musicurl")
|
||||
@XStreamAlias("MusicUrl")
|
||||
private String musicUrl;
|
||||
/**
|
||||
* 高质量音乐链接,WIFI环境优先使用该链接播放音乐
|
||||
*/
|
||||
@JSONField(name = "hqmusicurl")
|
||||
@XStreamAlias("HQMusicUrl")
|
||||
private String hqMusicUrl;
|
||||
/**
|
||||
* 缩略图的媒体id,通过上传多媒体文件,得到的id
|
||||
*/
|
||||
@JSONField(name = "thumb_media_id")
|
||||
@XStreamAlias("ThumbMediaId")
|
||||
private String thumbMediaId;
|
||||
|
||||
@@ -24,6 +24,11 @@ public class News extends Base implements Responseable, Notifyable {
|
||||
private static final int MAX_ARTICLE_COUNT = 10;
|
||||
private static final long serialVersionUID = 3348756809039388415L;
|
||||
|
||||
/**
|
||||
* 图文列表
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.model.Article
|
||||
*/
|
||||
@JSONField(name = "articles")
|
||||
@XStreamAlias("Articles")
|
||||
private List<Article> articles;
|
||||
|
||||
@@ -1 +1,9 @@
|
||||
不同的消息类型中的模型
|
||||
不同的消息类型中的消息对象
|
||||
|
||||
[被动消息](http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html)
|
||||
|
||||
[客服消息](http://mp.weixin.qq.com/wiki/1/70a29afed17f56d537c833f89be979c9.html#.E5.AE.A2.E6.9C.8D.E6.8E.A5.E5.8F.A3-.E5.8F.91.E6.B6.88.E6.81.AF)
|
||||
|
||||
[群发消息](http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html)
|
||||
|
||||
[模板消息](http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html)
|
||||
@@ -20,6 +20,9 @@ public class Text extends Base implements Responseable, Notifyable, Massable {
|
||||
|
||||
private static final long serialVersionUID = 520050144519064503L;
|
||||
|
||||
/**
|
||||
* 内容
|
||||
*/
|
||||
private String content;
|
||||
|
||||
public Text(String content) {
|
||||
|
||||
@@ -20,7 +20,9 @@ public class Trans extends Base implements Responseable {
|
||||
|
||||
private static final long serialVersionUID = -214711609286629729L;
|
||||
|
||||
// 指定会话接入的客服账号
|
||||
/**
|
||||
* 指定会话接入的客服账号
|
||||
*/
|
||||
@XStreamAlias("KfAccount")
|
||||
private String kfAccount;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.msg.model;
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import com.foxinmy.weixin4j.type.MediaType;
|
||||
import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
import com.thoughtworks.xstream.annotations.XStreamOmitField;
|
||||
|
||||
/**
|
||||
* 视频对象
|
||||
@@ -20,13 +21,26 @@ public class Video extends Base implements Responseable, Notifyable {
|
||||
|
||||
private static final long serialVersionUID = 2167437425244069128L;
|
||||
|
||||
/**
|
||||
* 上传视频微信返回的媒体ID
|
||||
*/
|
||||
@JSONField(name = "media_id")
|
||||
@XStreamAlias("MediaId")
|
||||
private String mediaId;
|
||||
/**
|
||||
* 缩略图的媒体ID(客服消息)
|
||||
*/
|
||||
@XStreamOmitField
|
||||
@JSONField(name = "thumb_media_id")
|
||||
private String thumbMediaId;
|
||||
/**
|
||||
* 视频标题
|
||||
*/
|
||||
@XStreamAlias("Title")
|
||||
private String title;
|
||||
/**
|
||||
* 视频描述
|
||||
*/
|
||||
@JSONField(name = "description")
|
||||
@XStreamAlias("Description")
|
||||
private String desc;
|
||||
|
||||
@@ -5,30 +5,65 @@ import java.io.Serializable;
|
||||
import com.foxinmy.weixin4j.type.EncryptType;
|
||||
import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
|
||||
/**
|
||||
* 微信的被动消息
|
||||
*
|
||||
* @className HttpWeixinMessage
|
||||
* @author jy
|
||||
* @date 2015年3月29日
|
||||
* @since JDK 1.7
|
||||
* @see
|
||||
*/
|
||||
@XStreamAlias("xml")
|
||||
public class HttpWeixinMessage implements Serializable {
|
||||
private static final long serialVersionUID = -9157395300510879866L;
|
||||
|
||||
// 以下字段是加密方式为「安全模式」时的参数
|
||||
/**
|
||||
* 公众号的唯一ID
|
||||
*/
|
||||
@XStreamAlias("ToUserName")
|
||||
private String toUserName;
|
||||
/**
|
||||
* 加密后的内容
|
||||
*/
|
||||
@XStreamAlias("Encrypt")
|
||||
private String encryptContent;
|
||||
/**
|
||||
* 加密类型
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.type.EncryptType
|
||||
*/
|
||||
private EncryptType encryptType;
|
||||
|
||||
// 以下字段每次被动消息时都会带上
|
||||
/**
|
||||
* 随机字符串
|
||||
*/
|
||||
private String echoStr;
|
||||
/**
|
||||
* 时间戳
|
||||
*/
|
||||
private String timeStamp;
|
||||
/**
|
||||
* 随机数
|
||||
*/
|
||||
private String nonce;
|
||||
/**
|
||||
* 参数签名
|
||||
*/
|
||||
private String signature;
|
||||
|
||||
// 冗余字段
|
||||
/**
|
||||
* 设置的token
|
||||
*/
|
||||
private String token;
|
||||
|
||||
// xml消息明文主体
|
||||
/**
|
||||
* xml消息明文主体
|
||||
*/
|
||||
private String originalContent;
|
||||
|
||||
// request method
|
||||
/**
|
||||
* 请求的方式
|
||||
*/
|
||||
private String method;
|
||||
|
||||
public String getToUserName() {
|
||||
@@ -113,11 +148,11 @@ public class HttpWeixinMessage implements Serializable {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HttpWeixinMessage [toUserName=" + toUserName + ", encryptContent="
|
||||
+ encryptContent + ", encryptType=" + encryptType
|
||||
+ ", echoStr=" + echoStr + ", timeStamp=" + timeStamp
|
||||
+ ", nonce=" + nonce + ", signature=" + signature + ", token="
|
||||
+ token + ", originalContent=" + originalContent + ", method="
|
||||
+ method + "]";
|
||||
return "HttpWeixinMessage [toUserName=" + toUserName
|
||||
+ ", encryptContent=" + encryptContent + ", encryptType="
|
||||
+ encryptType + ", echoStr=" + echoStr + ", timeStamp="
|
||||
+ timeStamp + ", nonce=" + nonce + ", signature=" + signature
|
||||
+ ", token=" + token + ", originalContent=" + originalContent
|
||||
+ ", method=" + method + "]";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,15 @@ public class ResponseMessage extends BaseMsg {
|
||||
xmlStream.addImplicitCollection(News.class, "articles");
|
||||
xmlStream.aliasSystemAttribute(null, "class");
|
||||
}
|
||||
private String attach; // 附加数据
|
||||
/**
|
||||
* 附加数据
|
||||
*/
|
||||
private String attach;
|
||||
/**
|
||||
* 消息对象
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.model.Responseable
|
||||
*/
|
||||
private final Base box;
|
||||
|
||||
public ResponseMessage(Base box) {
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.foxinmy.weixin4j.type;
|
||||
|
||||
/**
|
||||
* 消息加密类型
|
||||
*
|
||||
* @className EncryptType
|
||||
* @author jy
|
||||
* @date 2014年11月23日
|
||||
@@ -9,5 +10,12 @@ package com.foxinmy.weixin4j.type;
|
||||
* @see
|
||||
*/
|
||||
public enum EncryptType {
|
||||
RAW, AES
|
||||
/**
|
||||
* 明文模式
|
||||
*/
|
||||
RAW,
|
||||
/**
|
||||
* 密文模式
|
||||
*/
|
||||
AES;
|
||||
}
|
||||
|
||||
@@ -25,21 +25,114 @@ import com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage;
|
||||
* @see
|
||||
*/
|
||||
public enum EventType {
|
||||
subscribe(ScribeEventMessage.class), unsubscribe(ScribeEventMessage.class), scan(
|
||||
ScanEventMessage.class), scancode_push(MenuScanEventMessage.class), view(
|
||||
MenuEventMessage.class), scancode_waitmsg(
|
||||
MenuScanEventMessage.class), pic_sysphoto(
|
||||
MenuPhotoEventMessage.class), pic_photo_or_album(
|
||||
MenuPhotoEventMessage.class), pic_weixin(
|
||||
MenuPhotoEventMessage.class), location_select(
|
||||
MenuLocationEventMessage.class), click(MenuEventMessage.class), location(
|
||||
LocationEventMessage.class), masssendjobfinish(
|
||||
MassEventMessage.class), templatesendjobfinish(
|
||||
TemplatesendjobfinishMessage.class), enter_agent(
|
||||
EnterAgentEventMessage.class), kf_create_session(
|
||||
KfCreateEventMessage.class), kf_close_session(
|
||||
KfCloseEventMessage.class), kf_switch_session(
|
||||
KfSwitchEventMessage.class);
|
||||
/**
|
||||
* 关注事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.ScribeEventMessage
|
||||
*/
|
||||
subscribe(ScribeEventMessage.class),
|
||||
/**
|
||||
* 取消关注事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.ScribeEventMessage
|
||||
*/
|
||||
unsubscribe(ScribeEventMessage.class),
|
||||
/**
|
||||
* 二维码扫描事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.ScanEventMessage
|
||||
*/
|
||||
scan(ScanEventMessage.class),
|
||||
/**
|
||||
* 上报地理位置事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.LocationEventMessage
|
||||
*/
|
||||
location(LocationEventMessage.class),
|
||||
/**
|
||||
* 菜单扫描事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage
|
||||
*/
|
||||
scancode_push(MenuScanEventMessage.class),
|
||||
/**
|
||||
* 菜单点击关键字事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage
|
||||
*/
|
||||
view(MenuEventMessage.class),
|
||||
/**
|
||||
* 菜单点击链接事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage
|
||||
*/
|
||||
click(MenuEventMessage.class),
|
||||
/**
|
||||
* 菜单扫描并调出等待界面事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage
|
||||
*/
|
||||
scancode_waitmsg(MenuScanEventMessage.class),
|
||||
/**
|
||||
* 菜单弹出拍照事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage
|
||||
*/
|
||||
pic_sysphoto(MenuPhotoEventMessage.class),
|
||||
/**
|
||||
* 菜单弹出发图事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage
|
||||
*/
|
||||
pic_photo_or_album(MenuPhotoEventMessage.class),
|
||||
/**
|
||||
* 菜单弹出发图事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage
|
||||
*/
|
||||
pic_weixin(MenuPhotoEventMessage.class),
|
||||
/**
|
||||
* 菜单发送地理位置事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.menu.MenuLocationEventMessage
|
||||
*/
|
||||
location_select(MenuLocationEventMessage.class),
|
||||
/**
|
||||
* 群发消息事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.MassEventMessage
|
||||
*/
|
||||
masssendjobfinish(MassEventMessage.class),
|
||||
/**
|
||||
* 模板消息事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.TemplatesendjobfinishMessage
|
||||
*/
|
||||
templatesendjobfinish(TemplatesendjobfinishMessage.class),
|
||||
/**
|
||||
* 进入企业号应用事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.EnterAgentEventMessage
|
||||
*/
|
||||
enter_agent(EnterAgentEventMessage.class),
|
||||
/**
|
||||
* 客服接入会话事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.KfCreateEventMessage
|
||||
*/
|
||||
kf_create_session(KfCreateEventMessage.class),
|
||||
/**
|
||||
* 客服关闭会话事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.KfCloseEventMessage
|
||||
*/
|
||||
kf_close_session(KfCloseEventMessage.class),
|
||||
/**
|
||||
* 客服转接会话事件
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.KfSwitchEventMessage
|
||||
*/
|
||||
kf_switch_session(KfSwitchEventMessage.class);
|
||||
|
||||
private Class<? extends EventMessage> eventClass;
|
||||
|
||||
|
||||
@@ -17,10 +17,48 @@ import com.foxinmy.weixin4j.msg.event.EventMessage;
|
||||
*
|
||||
*/
|
||||
public enum MessageType {
|
||||
text(TextMessage.class), image(ImageMessage.class), voice(
|
||||
VoiceMessage.class), video(VideoMessage.class), location(
|
||||
LocationMessage.class), link(LinkMessage.class), event(
|
||||
EventMessage.class);
|
||||
/**
|
||||
* 文字消息
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.TextMessage
|
||||
*/
|
||||
text(TextMessage.class),
|
||||
/**
|
||||
* 图片消息
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.ImageMessage
|
||||
*/
|
||||
image(ImageMessage.class),
|
||||
/**
|
||||
* 语音消息
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.VoiceMessage
|
||||
*/
|
||||
voice(VoiceMessage.class),
|
||||
/**
|
||||
* 视频消息
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.VideoMessage
|
||||
*/
|
||||
video(VideoMessage.class),
|
||||
/**
|
||||
* 位置消息
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.LocationMessage
|
||||
*/
|
||||
location(LocationMessage.class),
|
||||
/**
|
||||
* 链接消息
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.LinkMessage
|
||||
*/
|
||||
link(LinkMessage.class),
|
||||
/**
|
||||
* 事件消息
|
||||
*
|
||||
* @see com.foxinmy.weixin4j.msg.event.EventMessage
|
||||
*/
|
||||
event(EventMessage.class);
|
||||
private Class<? extends BaseMsg> messageClass;
|
||||
|
||||
MessageType(Class<? extends BaseMsg> messageClass) {
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
消息类型、事件类型等枚举
|
||||
@@ -25,6 +25,12 @@ import com.foxinmy.weixin4j.model.Consts;
|
||||
*/
|
||||
public class ClassUtil {
|
||||
|
||||
/**
|
||||
* 获取某个包下所有的class信息
|
||||
*
|
||||
* @param _package 包对象
|
||||
* @return
|
||||
*/
|
||||
public static Set<Class<?>> getClasses(Package _package) {
|
||||
String packageName = _package.getName();
|
||||
String packageFileName = packageName.replace(".", File.separator);
|
||||
@@ -47,6 +53,13 @@ public class ClassUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 实例化目录下所有的class对象
|
||||
*
|
||||
* @param dir 文件目录
|
||||
* @param packageName 包的全限类名
|
||||
* @return
|
||||
*/
|
||||
private static Set<Class<?>> findClassesByFile(File dir, String packageName) {
|
||||
Set<Class<?>> classes = new HashSet<Class<?>>();
|
||||
File[] files = dir.listFiles(new FilenameFilter() {
|
||||
@@ -75,6 +88,13 @@ public class ClassUtil {
|
||||
return classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 实例化jar包下所有的class对象
|
||||
*
|
||||
* @param jar jar包对象
|
||||
* @param packageName 包的全限类名
|
||||
* @return
|
||||
*/
|
||||
private static Set<Class<?>> findClassesByJar(JarFile jar,
|
||||
String packageName) {
|
||||
Set<Class<?>> classes = new HashSet<Class<?>>();
|
||||
|
||||
@@ -19,18 +19,46 @@ public class DateUtil {
|
||||
private static final String yyyy_MM_dd = "yyyy-MM-dd";
|
||||
private static final String yyyyMMddHHmmss = "yyyyMMddHHmmss";
|
||||
|
||||
/**
|
||||
* 日期对象转换为yyyymmdd的字符串形式
|
||||
*
|
||||
* @param date
|
||||
* 日期对象
|
||||
* @return
|
||||
*/
|
||||
public static String fortmat2yyyyMMdd(Date date) {
|
||||
return new SimpleDateFormat(yyyyMMdd).format(date);
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期对象转换为yyyy_mm_dd的字符串形式
|
||||
*
|
||||
* @param date
|
||||
* 日期对象
|
||||
* @return
|
||||
*/
|
||||
public static String fortmat2yyyy_MM_dd(Date date) {
|
||||
return new SimpleDateFormat(yyyy_MM_dd).format(date);
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期对象转换为yyyymmddhhmmss的字符串形式
|
||||
*
|
||||
* @param date
|
||||
* 日期对象
|
||||
* @return
|
||||
*/
|
||||
public static String fortmat2yyyyMMddHHmmss(Date date) {
|
||||
return new SimpleDateFormat(yyyyMMddHHmmss).format(date);
|
||||
}
|
||||
|
||||
/**
|
||||
* yyyymmddhhmmss形式的字符串转换为日期对象
|
||||
*
|
||||
* @param date
|
||||
* 日期字符串
|
||||
* @return
|
||||
*/
|
||||
public static Date parse2yyyyMMddHHmmss(String date) {
|
||||
try {
|
||||
return new SimpleDateFormat(yyyyMMddHHmmss).parse(date);
|
||||
@@ -40,10 +68,22 @@ public class DateUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 单位为分的金额格式化为元的字符串形式
|
||||
*
|
||||
* @param fee
|
||||
* 金额 单位为分
|
||||
* @return
|
||||
*/
|
||||
public static String formaFee2Fen(double fee) {
|
||||
return new DecimalFormat("#").format(fee * 100);
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前时间戳转换为秒的字符串形式
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static String timestamp2string() {
|
||||
return String.valueOf(System.currentTimeMillis() / 1000);
|
||||
}
|
||||
|
||||
@@ -23,6 +23,14 @@ import com.alibaba.fastjson.TypeReference;
|
||||
* @see
|
||||
*/
|
||||
public class MapUtil {
|
||||
/**
|
||||
* 连接字符串
|
||||
* @param object 对象
|
||||
* @param encoder 是否编码
|
||||
* @param lowerCase 是否转换小写
|
||||
* @param extra 附加对象
|
||||
* @return
|
||||
*/
|
||||
public static String toJoinString(Object object, boolean encoder,
|
||||
boolean lowerCase, Map<String, String> extra) {
|
||||
String text = JSON.toJSONString(object);
|
||||
@@ -43,6 +51,13 @@ public class MapUtil {
|
||||
return toJoinString(map, encoder, lowerCase);
|
||||
}
|
||||
|
||||
/**
|
||||
* 连接字符串
|
||||
* @param map 对象
|
||||
* @param encoder 是否编码
|
||||
* @param lowerCase 是否转换小写
|
||||
* @return
|
||||
*/
|
||||
public static String toJoinString(Map<String, String> map, boolean encoder,
|
||||
boolean lowerCase) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.UUID;
|
||||
|
||||
/**
|
||||
* 随机码工具类
|
||||
*
|
||||
* @className RandomUtil
|
||||
* @author jy
|
||||
* @date 2014年10月22日
|
||||
@@ -17,7 +18,13 @@ public class RandomUtil {
|
||||
private static final String LETTERCHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
private static final String NUMBERCHAR = "0123456789";
|
||||
|
||||
// 返回一个定长的随机字符串(包含数字和大小写字母)
|
||||
/**
|
||||
* 返回一个定长的随机字符串(包含数字和大小写字母)
|
||||
*
|
||||
* @param length
|
||||
* 随机数的长度
|
||||
* @return
|
||||
*/
|
||||
public static String generateString(int length) {
|
||||
StringBuilder sb = new StringBuilder(length);
|
||||
Random random = new Random();
|
||||
@@ -27,7 +34,13 @@ public class RandomUtil {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
// 返回一个定长的随机纯数字字符串(只包含数字)
|
||||
/**
|
||||
* 返回一个定长的随机纯数字字符串(只包含数字)
|
||||
*
|
||||
* @param length
|
||||
* 随机数的长度
|
||||
* @return
|
||||
*/
|
||||
public static String generateStringByNumberChar(int length) {
|
||||
StringBuilder sb = new StringBuilder(length);
|
||||
Random random = new Random();
|
||||
@@ -37,7 +50,13 @@ public class RandomUtil {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
// 返回一个定长的随机纯字母字符串(只包含大小写字母)
|
||||
/**
|
||||
* 返回一个定长的随机纯字母字符串(只包含大小写字母)
|
||||
*
|
||||
* @param length
|
||||
* 随机数的长度
|
||||
* @return
|
||||
*/
|
||||
public static String generateStringByLetterCharr(int length) {
|
||||
StringBuilder sb = new StringBuilder(length);
|
||||
Random random = new Random();
|
||||
@@ -47,12 +66,24 @@ public class RandomUtil {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
// 返回一个定长的随机纯大写字母字符串(只包含大小写字母)
|
||||
/**
|
||||
* 返回一个定长的随机纯大写字母字符串(只包含大小写字母)
|
||||
*
|
||||
* @param length
|
||||
* 随机数的长度
|
||||
* @return
|
||||
*/
|
||||
public static String generateLowerString(int length) {
|
||||
return generateStringByLetterCharr(length).toLowerCase();
|
||||
}
|
||||
|
||||
// 返回一个定长的随机纯小写字母字符串(只包含大小写字母)
|
||||
/**
|
||||
* 返回一个定长的随机纯小写字母字符串(只包含大小写字母)
|
||||
*
|
||||
* @param length
|
||||
* 随机数的长度
|
||||
* @return
|
||||
*/
|
||||
public static String generateUpperString(int length) {
|
||||
return generateStringByLetterCharr(length).toUpperCase();
|
||||
}
|
||||
|
||||
@@ -15,12 +15,23 @@ import org.apache.commons.lang3.StringUtils;
|
||||
*/
|
||||
public class ReflectionUtil {
|
||||
|
||||
// 获取包包名
|
||||
/**
|
||||
* 获取包包名
|
||||
*
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
public static String getPackageName(Object obj) {
|
||||
return obj.getClass().getPackage().getName();
|
||||
}
|
||||
|
||||
// 获取字段的泛型参数类型
|
||||
/**
|
||||
* 获取字段的泛型参数类型
|
||||
*
|
||||
* @param obj
|
||||
* @param fieldName
|
||||
* @return
|
||||
*/
|
||||
public static Class<?> getFieldGenericType(Object obj, String fieldName) {
|
||||
Field field = getAccessibleField(obj, fieldName);
|
||||
Type type = field.getGenericType();
|
||||
|
||||
@@ -14,6 +14,15 @@ import com.thoughtworks.xstream.io.HierarchicalStreamReader;
|
||||
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
|
||||
import com.thoughtworks.xstream.mapper.Mapper;
|
||||
|
||||
/**
|
||||
* Map转换为实体对象
|
||||
*
|
||||
* @className Map2ObjectConverter
|
||||
* @author jy
|
||||
* @date 2015年3月29日
|
||||
* @since JDK 1.7
|
||||
* @see
|
||||
*/
|
||||
public class Map2ObjectConverter extends MapConverter {
|
||||
|
||||
public Map2ObjectConverter(Mapper mapper) {
|
||||
|
||||
Reference in New Issue
Block a user