新增代金券接口&字段上的单行注释调整为文档多行注释

This commit is contained in:
jinyu
2015-03-29 22:45:50 +08:00
parent 5557141b93
commit 464359ae7a
155 changed files with 3825 additions and 591 deletions
+5 -1
View File
@@ -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&timestamp=%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;
/**
* 语音格式,如amrspeex等
*/
@XStreamAlias("Format")
private String format; // 语音格式,如amrspeex等
private String format;
/**
* 语音识别结果,UTF8编码
*/
@XStreamAlias("Recognition")
private String recognition; // 语音识别结果,UTF8编码
private String recognition;
public String getRecognition() {
return recognition;
@@ -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 + ", ="
@@ -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 + ", ="
@@ -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
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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) {