java版微信公众号开发(三):自动回复功能实现
微信公众平台服务器配置通过后,就能进行下面的开发啦~~
首先可以查看官方的说明文档:https://mp.weixin.qq.com/wiki...
普通消息的类型分为7种:
- 文本消息
- 图片消息
- 语音消息
- 视频消息
- 小视频消息
- 地理位置消息
- 链接消息
下面介绍实现文本的自动回复:
文本消息的XML结构是:
<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[this is a test] ]></Content> <MsgId>1234567890123456</MsgId> </xml>
参数包含:
根据开发文档直接上手--->_>
实体类的定义:
定义一个BaseMessage,消息基类,封装通用属性:
public class BaseMessage { // 开发者微信号 private String ToUserName; // 发送方帐号(一个OpenID) private String FromUserName; // 消息创建时间 (整型) private long CreateTime; // 消息类型(text/image/location/link) private String MsgType; // 消息id,64位整型 private long MsgId; /** * 位0x0001被标志时,星标刚收到的消息 */ private int FuncFlag; public String getToUserName() { return ToUserName; } public void setToUserName(String toUserName) { ToUserName = toUserName; } public String getFromUserName() { return FromUserName; } public void setFromUserName(String fromUserName) { FromUserName = fromUserName; } public long getCreateTime() { return CreateTime; } public void setCreateTime(long l) { CreateTime = l; } public String getMsgType() { return MsgType; } public void setMsgType(String msgType) { MsgType = msgType; } public long getMsgId() { return MsgId; } public void setMsgId(long msgId) { MsgId = msgId; } public int getFuncFlag() { return FuncFlag; } public void setFuncFlag(int funcFlag) { FuncFlag = funcFlag; } }
接下来TextMessage,文本属性TextMessage:
public class TextMessage extends BaseMessage{ // 消息内容 private String Content; public String getContent() { return Content; } public void setContent(String content) { Content = content; } }
一定要注意,属性名称需要大写,属性名称需要大写,属性名称需要大写!!不要问我为啥这么强调。
新建接口MessageService,并实现接口:
public interface MessageService { /** * 微信公众号处理 * @param request * @return */ String newMessageRequest(HttpServletRequest request); }
@Service("messageService") public class MessageServiceImpl implements MessageService { private static final Logger LOGGER = LoggerFactory.getLogger(MessageServiceImpl.class); @Override public String newMessageRequest(HttpServletRequest request) { String respMessage = null; try { // xml请求解析 Map<String, String> requestMap = MessageUtil.xmlToMap(request); // 发送方帐号(open_id) String fromUserName = requestMap.get("FromUserName"); // 公众帐号 String toUserName = requestMap.get("ToUserName"); // 消息类型 String msgType = requestMap.get("MsgType"); // 消息内容 String content = requestMap.get("Content"); LOGGER.info("FromUserName is:" + fromUserName + ", ToUserName is:" + toUserName + ", MsgType is:" + msgType); // 文本消息 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { //这里根据关键字执行相应的逻辑 /*if(content.equals("xxx")){ }*/ //自动回复 TextMessage text = new TextMessage(); text.setContent("霍霍哈嘿"+content); text.setToUserName(fromUserName); text.setFromUserName(toUserName); text.setCreateTime(new Date().getTime()); text.setMsgType(msgType); respMessage = MessageUtil.textMessageToXml(text); } // 事件推送 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) { String eventType = requestMap.get("Event");// 事件类型 // 订阅 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { //文本消息 TextMessage text = new TextMessage(); text.setContent("我不管,我最美!!"); text.setToUserName(fromUserName); text.setFromUserName(toUserName); text.setCreateTime(new Date().getTime()); text.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); respMessage = MessageUtil.textMessageToXml(text); } // 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息 else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {// 取消订阅 } } } catch (Exception e) { LOGGER.error("error......"); } return respMessage; } }
上一篇文章,已经创建了WechatIndexController ,里面的GET方法用来验证token,下面直接加一个POST方法,用于进行消息管理。
@Autowired private MessageService messageService; @RequestMapping(method = RequestMethod.POST) public void post(HttpServletRequest request, HttpServletResponse response) { try { request.setCharacterEncoding("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); log.error(e.getMessage(),e); } response.setContentType("text/html;charset=UTF-8"); // 调用核心业务类接收消息、处理消息 String respMessage = messageService.newMessageRequest(request); // 响应消息 PrintWriter out = null; try { out = response.getWriter(); out.print(respMessage); } catch (IOException e) { e.printStackTrace(); log.error(e.getMessage(),e); } finally { out.close(); out = null; } }
启动服务,关注此微信公众号,就会按照我们设置的显示啦!!
另外,图文的实现与之类似,这里不在进行过多的阐述,源码中已经实现,需要的可以直接下载查看。
相关推荐
jieq 2020-11-09
ZZZhangbingyi 2020-08-26
haixianTV 2020-08-15
Develop 2020-06-25
郴州小程序 2020-06-13
huningjun 2020-06-12
zuoliangzhu 2020-06-11
hgzhang 2020-06-04
浪味仙 2020-06-03
powderhose 2020-06-02
cdkey 2020-05-29
戴翔的技术 2020-05-27
郴州小程序 2020-05-26
cdkey 2020-05-26
sucheng 2020-05-25
newhappy 2020-05-16
cbao 2020-05-12
cbao 2020-04-26
草根工程师 2020-03-27