Java微信公众平台之消息管理

网友投稿 207 2023-08-05

Java微信公众平台之消息管理

java微信公众平台开发之消息管理,一定要先看下官方文档

微信消息管理分为接收普通消息、接收事件推送、gqWQUnDOA发送消息(被动回复)、客服消息、群发消息、模板消息这几部分

一、接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

关于MsgId,官方给出解释,相当于每个消息ID,关于重试的消息排重,推荐使用msgid排重。微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。

比如文本消息的Xml示例

<![CDATA[toUser]]>

<![CDATA[fromUser]]>

1348831860

<![CDATA[text]]>

<![CDATA[this is a test]]>

1234567890123456

其他的消息去官方文档查看,简单封装如下

消息抽象基类AbstractMsg.java

package com.phil.wechat.msg.model.req;

import java.io.Serializable;

/**

* 基础消息类

*

* @author phil

*

*/

public abstract class AbstractMsg implements Serializable {

private static final long serialVersionUID = -6244277633057415731L;

private String ToUserName; // 开发者微信号

private String FromUserName; // 发送方帐号(一个OpenID)

private String MsgType = SetMsgType(); // 消息类型 例如 /text/image

private long CreateTime; // 消息创建时间 (整型)

private long MsgId; // 消息id,64位整型

/**

* 消息类型

*

* @return

*/

public abstract String SetMsgType();

}

文本消息TextMsg.java

package com.phil.wechat.msg.model.req;

/**

* 文本消息

* @author phil

* @date 2017年6月30日

*

*/

public class TextMsg extends AbstractMsg {

private static final long serialVersionUID = -1764016801417503409L;

private String Content; // 文本消息

@Override

public String SetMsgType() {

return "text";

}

}

其他的依样画葫芦......

二、被动回复用户消息

开发者在5秒内未回复任何内容

开发者回复了异常数据

比如回复的文本消息Xml示例

<![CDATA[toUser]]>

<![CDATA[fromUser]]>

12345678

<![CDATA[text]]>

<![CDATA[你好]]>

简单封装下

回复消息抽象基类RespAbstractMsg.java

package com.phil.wechat.msg.model.resp;

import java.io.Serializable;

/**

* 消息基类(公众帐号 -> 普通用户)

*

* @author phil

*

*/

public abstract class RespAbstractMsg{

// 接收方帐号(收到的OpenID)

private String ToUserName;

// 开发者微信号

private String FromUserName;

// 消息创建时间 (整型)

private long CreateTime;

// 消息类型(text/music/news)

private String MsgType = setMsgType(); // 消息类型

public abstract String setMsgType();

}

回复文本消息RespTextMsg.java

package com.phil.wechat.msg.model.resp;

/**

* 回复图片消息

*

* @author phil

* @data 2017年3月26日

*

*/

public class RespImageMsg extends RespAbstractMsg {

private Image Image;

@Override

public String setMsgType() {

return "image";

}

/**

*

* @author phil

* @date 2017年7月19日

*

*/

public class Image {

// 通过素材管理中的接口上传多媒体文件,得到的id。

private String MediaId;

public String getMediaId() {

return MediaId;

}

public void setMediaId(String mediaId) {

MediaId = mediaId;

}

}

}

其他消息类型依样画葫芦......

三、消息的处理

掌握xml解析

package com.phil.wechat.msg.controller;

import java.io.IOException;

import java.io.InputStream;

import java.util.Map;

import java.util.Objects;

import org.apache.commons.lang3.StringUtils;

import org.dom4j.DocumentException;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import com.phil.modules.config.WechatConfig;

import com.phil.modules.util.MsgUtil;

import com.phil.modules.util.SignatureUtil;

import com.phil.modules.util.XmlUtil;

import com.phil.wechat.base.controller.BaseController;

import com.phil.wechat.base.result.WechatResult;

import com.phil.wechat.msg.model.req.Basicmsg;

import com.phil.wechat.msg.model.resp.RespAbstractMsg;

import com.phil.wechat.msg.model.resp.RespNewsMsg;

import com.phil.wechat.msg.service.WechatMsgService;

/**

* @author phil

* @date 2017年9月19日

*

*/

@Controller

@RequestMapping("/wechat")

public class WechatMsgController extends BaseController {

private Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired

private WechatMsgService wechatMsgService;

/**

* 校验信息是否是从微信服务器发出,处理消息

* @param out

* @throws IOException

*/

@RequestMapping(value = "/handler", method = { RequestMethod.GET, RequestMethod.POST })

public void processPost() throws Exception {

this.getRequest().setCharacterEncoding("UTF-8");

this.getResponse().setCharacterEncoding("UTF-8");

boolean ispost = Objects.equals("POST", this.getRequest().getMethod().toUpperCase());

if (ispost) {

logger.debug("接入成功,正在处理逻辑");

String respXml = defaultMsgDisPose(this.getRequest().getInputStream());//processRequest(request, response);

if (StringUtils.isNotBlank(respXml)) {

this.getResponse().getWriter().write(respXml);

}

} else {

String signature = this.getRequest().getParameter("signature");

// 时间戳

String timestamp = this.getRequest().getParameter("timestamp");

// 随机数

String nonce = this.getRequest().getParameter("nonce");

// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败

if (SignatureUtil.checkSignature(signature, timestamp, nonce)) {

// 随机字符串

String echostr = this.getRequest().getParameter("echostr");

logger.debug("接入成功,echostr {}", echostr);

this.getResponse().getWriter().write(echostr);

}

}

}

/**

* 默认处理方法

* @param input

* @return

* @throws Exception

* @throws DocumentException

*/

private String defaultMsgDisPose(InputStream inputStream) throws Exception {

String result = null;

if (inputStream != null) {

Map params = XmlUtil.parseStreamToMap(inputStream);

if (params != null && params.size() > 0) {

BasicMsg msgInfo = new BasicMsg();

String createTime = params.get("CreateTime");

String msgId = params.get("MsgId");

msgInfo.setCreateTime((createTime != null && !"".equals(createTime)) ? Integer.parseInt(createTime) : 0);

msgInfo.setFromUserName(params.get("FromUserName"));

msgInfo.setMsgId((msgId != null && !"".equals(msgId)) ? Long.parseLong(msgId) : 0);

msgInfo.setToUserName(params.get("ToUserName"));

WechatResult resultObj = coreHandler(msgInfo, params);

if(resultObj == null){ //

return null;

}

boolean success = resultObj.isSuccess(); //如果 为true,则表示返回xml文件, 直接转换即可,否则按类型

if (success) {

result = resultObj.getObject().toString();

} else {

int type = resultObj.getType(); // 这里规定 1 图文消息 否则直接转换

if (type == WechatResult.NEWSMSG) {

RespNewsMsg newsMsg = (RespNewsMsg) resultObj.getObject();

result = MsgUtil.newsMsgToXml(newsMsg);

} else {

RespAbstractMsg basicMsg = (RespAbstractMsg) resultObj.getObject();

result = MsgUtil.msgToXml(basicMsg);

}

}

} else {

result = "msg is wrong";

}

}

return result;

}

/**

* 核心处理

*

* @param msg

* 消息基类

* @param params

* xml 解析出来的 数据

* @return

*/

private WechatResult coreHandler(BasicMsg msg, Map params) {

WechatResult result = null;

String msgType = params.get("MsgType");

if (StringUtils.isEmpty(msgType)) {

switch (msgType) {

case WechatConfig.REQ_MESSAGE_TYPE_TEXT: // 文本消息

rehttp://sult = wechatMsgService.textMsg(msg, params);

break;

case WechatConfig.REQ_MESSAGE_TYPE_IMAGE: // 图片消息

result = wechatMsgService.imageMsg(msg, params);

break;

case WechatConfig.REQ_MESSAGE_TYPE_LINK: // 链接消息

result = wechatMsgService.linkMsg(msg, params);

break;

case WechatConfig.REQ_MESSAGE_TYPE_LOCATION: // 地理位置

result = wechatMsgService.locationMsg(msg, params);

break;

case WechatConfig.REQ_MESSAGE_TYPE_VOICE: // 音频消息

result = wechatMsgService.voiceMsg(msg, params);

break;

case WechatConfig.REQ_MESSAGE_TYPE_SHORTVIDEO: // 短视频消息

result = wechatMsgService.shortvideo(msg, params);

break;

case WechatConfig.REQ_MESSAGE_TYPE_VIDEO: // 视频消息

result = wechatMsgService.videoMsg(msg, params);

break;

case WechatConfig.REQ_MESSAGE_TYPE_EVENT: // 事件消息

String eventType = params.get("Event"); //

if (eventType != null && !"".equals(eventType)) {

switch (eventType) {

case WechatConfig.EVENT_TYPE_SUBSCRIBE:

result = wechatMsgService.subscribe(msg, params);

break;

case WechatConfig.EVENT_TYPE_UNSUBSCRIBE:

result = wechatMsgService.unsubscribe(msg, params);

break;

case WechatConfig.EVENT_TYPE_SCAN:

result = wechatMsgService.scan(msg, params);

break;

case WechatConfig.EVENT_TYPE_LOCATION:

result = wechatMsgService.eventLocation(msg, params);

break;

case WechatConfig.EVENT_TYPE_CLICK:

result = wechatMsgService.eventClick(msg, params);

break;

case WechatConfig.EVENT_TYPE_VIEW:

result = wechatMsgService.eventView(msg, params);

break;

case WechatConfig.KF_CREATE_SESSION:

result = wechatMsgService.kfCreateSession(msg, params);

break;

case WechatConfig.KF_CLOSE_SESSION:

result = wechatMsgService.kfCloseSession(msg, params);

break;

case WechatConfig.KF_SWITCH_SESSION:

result = wechatMsgService.kfSwitchSession(msg, params);

break;

default:

wechatMsgService.eventDefaultReply(msg, params);

break;

}

}

break;

default:

wechatMsgService.defaultMsg(msg, params);

}

}

return result;

}

}

只是提供个思路,如若参考代码请移步

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue2.0实现移动端的输入框实时检索更新列表功能
下一篇:详解基于mpvue的小程序markdown适配解决方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~