Go...

当前位置: 首页>>世界杯冠军魔咒

03. 微信公众号消息接收、事件推送与响应处理

使用xstream将 bean 转为 xml

com.thoughtworks.xstream

xstream

1.4.17

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 String beanToXml(Object bean, Class cls) {

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());

}

}

源码