Go...
Go...
使用xstream将 bean 转为 xml
Controller
/**
* 接收微信公众号关注者的消息并且给予回应
* 返回 xml 格式
* 路径与`测试号 --> 接口配置信息 --> URL`一致,即与`微信接入`的`URL`一致,但为 `POST` 请求
*
还有一个参数:消息发送者 openId,@RequestParam(required = false) String openid,请求体里面有了,且如果加密,该参数为空
*
* @param bean {@link WxInMsgBean},公众号关注者发送的消息
* @param signature 加密后的字符串
* @param timestamp 时间戳
* @param nonce 随机数
* @return 返回 XMl 字符串
*/
@PostMapping(value = "/weChat", produces = "application/xml; charset=UTF-8")
public String msgHandle(@RequestBody WxInMsgBean bean,
@RequestParam(required = false) String signature,
@RequestParam(required = false) String timestamp,
@RequestParam(required = false) String nonce) {
return wxService.msgHandle(bean, signature, timestamp, nonce);
}
service
/**
* 处理发送的消息
*
* @param bean {@link WxInMsgBean},公众号关注者发送的消息
* @param signature 加密后的字符串
* @param timestamp 时间戳
* @param nonce 随机数
* @return 返回 XMl 字符串
*/
String msgHandle(WxInMsgBean bean, String signature, String timestamp, String nonce);
@Override
public String msgHandle(WxInMsgBean bean, String signature, String timestamp, String nonce) {
/*
验证是否是正常请求
*/
if (!checkToken(signature, timestamp, nonce, wxConfig.getToken())) {
throw new IllegalArgumentException("微信-非法请求,可能属于伪造请求");
}
log.info("WxInMsgBean: {}", bean.toString());
String msg = WxConstant.MSG_SUCCESS;
switch (bean.getMsgType()) {
case WxConstant.MSG_TYPE_TEXT:
// 处理 文本信息
msg = WxTextMsgBean.getInstance(bean.getFromUserName(), bean.getToUserName(), bean.getCreateTime(), bean.getContent()).toXml();
break;
case WxConstant.MSG_TYPE_IMAGE:
// 处理图片信息
msg = WxImageMsgBean.getInstance(bean.getFromUserName(), bean.getToUserName(), bean.getCreateTime(), bean.getMediaId()).toXml();
break;
case WxConstant.MSG_TYPE_EVENT:
// 处理事件
switch (bean.getEvent()) {
case WxConstant.EVENT_TYPE_SUBSCRIBE:
// 用户关注公众号
ArticlesBean articlesBean = ArticlesBean.getInstance("标题", "http://mmbiz.qpic.cn/mmbiz_jpg/8IpUia88gYWiaj07aFP5jcHH5gDlicXhlgNwS2gxfEbC1T4NLGAr9qowOPLHIXBHFhewUxaogqcDMHgcmnZyt5MibA/0", "图文信息", "http://www.baidu.com");
ArticlesBean articlesBean1 = ArticlesBean.getInstance("标题", "http://mmbiz.qpic.cn/mmbiz_jpg/8IpUia88gYWiaj07aFP5jcHH5gDlicXhlgNwS2gxfEbC1T4NLGAr9qowOPLHIXBHFhewUxaogqcDMHgcmnZyt5MibA/0", "图文信息", "http://www.baidu.com");
ArticlesBean articlesBean2 = ArticlesBean.getInstance("标题", "http://mmbiz.qpic.cn/mmbiz_jpg/8IpUia88gYWiaj07aFP5jcHH5gDlicXhlgNwS2gxfEbC1T4NLGAr9qowOPLHIXBHFhewUxaogqcDMHgcmnZyt5MibA/0", "图文信息", "http://www.baidu.com");
msg = WxNewsMsgBean.getInstance(bean.getFromUserName(), bean.getToUserName(), bean.getCreateTime(), articlesBean, articlesBean1, articlesBean2).toXml();
break;
case WxConstant.EVENT_TYPE_UNSUBSCRIBE:
// 用户取消关注
// 加入黑名单、删除数据库等操作
break;
default:
break;
}
break;
default:
msg = WxTextMsgBean.getInstance(bean.getFromUserName(), bean.getToUserName(), bean.getCreateTime(), "暂时只支持文本、图片消息").toXml();
break;
}
log.info("回复信息 msg: {}", msg);
return msg;
}
封装结果集
baseBean
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import java.io.Serializable;
/**
* 微信被动回复信息-基础 bean
*
* @author sheng_zs@126.com
* @date 2021-08-02 17:19
*/
@Data
public abstract class WxOutMsgBaseBean implements Serializable {
/**
* 开发者微信号
*/
@XStreamAlias("ToUserName")
protected String toUserName;
/**
* 发送方帐号(一个OpenID)
*/
@XStreamAlias("FromUserName")
protected String fromUserName;
/**
* 消息创建时间 (整型)
*/
@XStreamAlias("CreateTime")
protected Long createTime;
/**
* 消息类型: {@link com.small.nine.wxmp.common.constant.WxConstant} MSG_TYPE_*
*/
@XStreamAlias("MsgType")
protected String msgType;
/**
* 转化为 XML 字符串
*
* @return XML 字符串
*/
public abstract String toXml();
}
文本信息及图片信息
文本信息
import com.small.nine.wxmp.common.constant.WxConstant;
import com.small.nine.wxmp.utils.wx.XmlUtils;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 回复文本消息
*
* @author sheng_zs@126.com
* @date 2021-08-02 17:22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@XStreamAlias("xml")
public class WxTextMsgBean extends WxOutMsgBaseBean {
/**
* 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
*/
@XStreamAlias("Content")
private String content;
@Override
public String toXml() {
return XmlUtils.beanToXml(this);
}
/**
* 初始化
*
* @param toUser 接收者,openID
* @param fromUser 发送者
* @param createTime 时间戳
* @param content 文本信息
* @return {@link WxTextMsgBean}
*/
public static WxTextMsgBean getInstance(String toUser, String fromUser, Long createTime, String content) {
WxTextMsgBean msgBean = new WxTextMsgBean();
msgBean.setToUserName(toUser);
msgBean.setFromUserName(fromUser);
msgBean.setMsgType(WxConstant.MSG_TYPE_TEXT);
msgBean.setCreateTime(createTime);
msgBean.setContent(content);
return msgBean;
}
}
图片信息
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import java.io.Serializable;
/**
* 图片信息
*
* @author sheng_zs@126.com
* @date 2021-08-02 17:29
*/
@Data
@XStreamAlias("Image")
public class ImageBean implements Serializable {
/**
* 通过素材管理中的接口上传多媒体文件,得到的id。
*/
@XStreamAlias("MediaId")
private String mediaId;
}
import com.small.nine.wxmp.common.constant.WxConstant;
import com.small.nine.wxmp.utils.wx.XmlUtils;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 回复图片消息
*
* @author sheng_zs@126.com
* @date 2021-08-02 17:30
*/
@Data
@EqualsAndHashCode(callSuper = true)
@XStreamAlias("xml")
public class WxImageMsgBean extends WxOutMsgBaseBean {
/**
* Image 节点
*/
@XStreamAlias("Image")
private ImageBean image;
@Override
public String toXml() {
return XmlUtils.beanToXml(this);
}
/**
* 初始化
*
* @param toUser 接收者,openID
* @param fromUser 发送者
* @param createTime 时间戳
* @param mediaId 图片ID
* @return {@link WxImageMsgBean}
*/
public static WxImageMsgBean getInstance(String toUser, String fromUser, Long createTime, String mediaId) {
WxImageMsgBean msgBean = new WxImageMsgBean();
msgBean.setToUserName(toUser);
msgBean.setFromUserName(fromUser);
msgBean.setMsgType(WxConstant.MSG_TYPE_IMAGE);
msgBean.setCreateTime(createTime);
ImageBean bean = new ImageBean();
bean.setMediaId(mediaId);
msgBean.setImage(bean);
return msgBean;
}
}
工具类
import com.thoughtworks.xstream.XStream;
/**
* xml 相关工具类
*
* @author sheng_zs@126.com
* @date 2021-08-02 17:23
*/
public class XmlUtils {
/**
* 将 Java Bean 转化为 XML
*
* @param bean {@link Object}
* @param cls 传入对象的字节码
* @return XML 字符串
*/
public static
XStream stream = new XStream();
stream.processAnnotations(cls);
return stream.toXML(bean);
}
/**
* 将 Java Bean 转化为 XML
*
* @param bean {@link Object}
* @return XML 字符串
*/
public static String beanToXml(Object bean) {
return beanToXml(bean, bean.getClass());
}
}
源码